В следующей программе я использовал ключевое слово unsigned
.
#include <stdio.h>
int main()
{
unsigned char i = 'A';
unsigned j = 'B';
printf(" i = %c j = %c", i, j);
}
Вывод:
i = A j = B
unsigned char i
эквивалентно unsigned j
?
6 ответов
unsigned char i
эквивалентноunsigned j
?
Нет, когда спецификатор типа опущен и используется любой из спецификаторов signed
, unsigned
, short
или long
, предполагается int
.
Это означает, что следующие объявления эквивалентны:
long a;
long int a;
unsigned short b;
unsigned short int b;
Проблема с подписью char
заключается в том, что, когда signed
или unsigned
опущены, подпись зависит от реализации:
char x; // signedness depends on the implementation
unsigned char y; // definitely unsigned
signed char z; // definitely signed
unsigned
, int
и char
- это так называемые спецификаторы типа . Правила C о спецификаторах типов очень странные и иррациональные, иногда по причинам обратной совместимости.
Глава 6.7.2 / 2 стандарта C выглядит так:
signed char
означаетsigned char
.unsigned char
означаетunsigned char
.char
- это отдельный тип, отличный от двух вышеупомянутых, и может быть как со знаком, так и без знака. Зависит от компилятора.short
,signed short
,short int
илиsigned short int
означаетshort
.unsigned short
илиunsigned short int
означаетunsigned short
.int
,signed
илиsigned int
означаетint
.unsigned
илиunsigned int
означаетunsigned int
.long
,signed long
,long int
илиsigned long int
означаетlong
.
И так далее. Если вы думаете, что эта система не имеет особого смысла, это потому, что это не так.
Учитывая вышеизложенное, мы можем сказать, что unsigned char
и unsigned
относятся к разным типам.
Однако существует специальное правило случая (называемое «продвижение аргументов по умолчанию») для всех функций с переменным аргументом, таких как printf
, в котором говорится, что все малые целые типы, такие как char
, неявно повышаются до типа {{X2} }. Вот почему вы можете printf("%d"
использовать как символы, так и целые числа. Точно так же %c
работает с целыми числами, потому что для printf фактически невозможно получить реальный, не продвигаемый тип символа через свои параметры. Все, что тип int
или меньше, будет отображаться как int
на стороне printf.
Нет, они не эквивалентны. unsigned char
и unsigned
- два разных типа (unsigned
эквивалентен unsigned int
). Это оба целых типа без знака, и они могут содержать некоторые одинаковые значения.
Спецификатор формата %c
для printf
ожидает аргумент типа int
(который является подписанным целочисленным типом). Аргумент unsigned char
повышается до int
, так что это нормально. Аргумент unsigned int
не преобразуется в int
, но в этом случае он работает (по причинам, которые я не буду вдаваться).
Обратите внимание, что символьные константы, такие как 'A'
, также имеют тип int
.
Нет, unsigned j
совпадает с unsigned int j
.
Согласно C11
, глава §6.7.2, Спецификаторы типа
unsigned
илиunsigned int
Итак, очевидно, что при отсутствии int
переменная все равно будет целой.
Тем не менее, чтобы устранить путаницу, в спецификации перечислены
unsigned char
...
unsigned
илиunsigned int
Как два разных спецификатора типа, поэтому очевидно, что они не совпадают.
Ответ - нет.
Когда вы не указываете тип в следующих случаях signed
unsigned
long
short
и назначаете номер по умолчанию, он принимается как int
.
В случае персонажей
char a; // Depends on implementations.
signed char b; // Signed
unsigned char c; // Unsigned
Немного зависит от компилятора и архитектуры, но, как правило, длина unsigned int составляет 4 или 8 байтов, а длина unsigned char обычно составляет 1 октет.
Это означает, что беззнаковый символ занимает от 4 до 8 раз больше места и может содержать гораздо большее число (например, беззнаковый может содержать число 1024, в то время как типичный беззнаковый символ может содержать только до 255). В зависимости от порядка байтов вашего процессора, первый октет unsigned может быть таким же, как версия unsigned char (или нет).
Пока вы не заботитесь об использовании памяти, ее переполнении или не пытаетесь делать странные вещи с указателями, это одно и то же. Но они начинают быстро отличаться, когда вы начинаете делать более забавные вещи на C.
Похожие вопросы
Связанные вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.