Разница между подписанным и неподписанным типами данных? - PullRequest
6 голосов
/ 17 апреля 2011
main()
{
    char i=255;
    printf("\n%x\n",i);
}

выход: ffffffff

main()
{
    u_char i=255;
    printf("\n%x\n",i);
}

выход: ff

Что здесь происходит? Пожалуйста, объясните мне несколько хороших ссылок. Я думаю, это очень простая вещь, и я очень запутался ...

Ответы [ 4 ]

10 голосов
/ 17 апреля 2011

То, что вы видите здесь, вызвано двумя вещами:

  • 255 не вписывается в диапазон char (обратите внимание, что это определяется реализацией, является ли char эквивалентным signed char или unsigned char, но, очевидно, на вашей платформе это signed char) , Результирующее поведение определяется реализацией, но обычно оно оборачивается и становится -1; см дополнения до двух .
  • целочисленное продвижение , потому что printf() является функцией переменного аргумента . Аргументы целочисленного типа (например, char) автоматически переводятся в int.

Итак, printf() видит int со значением -1 и печатает его шестнадцатеричное представление соответствующим образом.

В случае unsigned обхода нет. printf() видит int со значением 255 и печатает его шестнадцатеричное представление соответственно (без начальных нулей).

4 голосов
/ 17 апреля 2011

Компилятор C должен расширить передаваемое значение до printf (это называется "продвижение"), потому что printf - это функция с переменным числом аргументов (ее можно вызывать с разными аргументами).Для значений типа char повышенное значение имеет тип int.Поскольку тип вашего компилятора char кажется подписанным, повышенное значение является расширенным знаком.В двоичном виде:

char i = 255           // or: 11111111 in binary
int promoted_i = -1    // or: 11....11111 (usually, 32 or 64 ones)

В случае без знака расширение знака не происходит:

char u = 255           // or: 11111111 in binary, same as above but with different interpretation
unsigned int pu = i    // or: 00....0011111111 (8 ones, preceded by the appropriate number of zeroes) 
0 голосов
/ 17 апреля 2011

Когда вы устанавливаете 8-битную переменную со знаком в значение 255, которое она не может содержать, кажется, что в этом случае она устанавливает отрицательный (высокоуровневый) флаг в 1, поэтому значение будет равно -1, если оно было подписано, но затем оно конвертируется в целое число -1, равное ffffffff.

0 голосов
/ 17 апреля 2011

char i = 255; вызывает поведение, определяемое реализацией, путем преобразования значения в тип со знаком, к которому оно не подходит (при условии, что char только 8 бит, а обычный char подписан, оба из которых также зависят от реализации.

...