Странный результат при использовании спецификатора% d для печати беззнакового символа в C - PullRequest
0 голосов
/ 18 февраля 2011

Это немного странно. Я просто играю с неподписанным типом символа и отрицательными значениями. У меня есть следующий код.

 #include <stdio.h>

 int main(int argc, char* agrv[]){
   unsigned char c = -3;
   printf("%d, %u, %d, %u\n", c, c, ~c, ~c);
 }

Вывод,

253, 253, -254, 4294967042

Не могу разобраться с последними тремя значениями. Что на самом деле делают% d и% u?

Ответы [ 4 ]

3 голосов
/ 18 февраля 2011

Формат %d печатает int, а %u печатает unsigned int. Вся арифметика значений unsigned char выполняется путем их приведения к int и выполнения операций со значениями int, поэтому ~c (что равно -1 - (int)c) вернет отрицательное значение int. Для получения результата unsigned char до его распечатки понадобится явное приведение (и вызов printf в любом случае приведёт к int).

1 голос
/ 18 февраля 2011

c равно 11 11 11 01 (дополнение 2) 1. при печати в виде целого числа со знаком (% d) оно интерпретирует 32 бита c 00000000-00000000-00000000-11111101, что равно десятичному значению 253. 2.% u также печатает то же самоекак указано выше, число (слово) положительное.

~ c равно 1111111111-11111111-11111111-00000010

  1. При печати в виде% d его -254 (снова 2'cдополнение)

  2. Выше числа при интерпретации как без знака (255 * 256 ^ 3 + 255 * 256 ^ 2 + 255 * 256 + 2) его значение равно 4294967042.

1 голос
/ 18 февраля 2011

"% d" печатает как число со знаком,% u печатает как число без знака.

char повышается до int, когда вы передаете его printf. printf обычно принимает любое значение, которое находится в стеке, и интерпретирует его как тип, указанный в вашем формате. На типичной машине (по-видимому, включая вашу) это означает, что она рассматривает битовую комбинацию как дополнение к двум.

0 голосов
/ 18 февраля 2011

Ну, я бы не пошел до printf (). Я бы предпочел остановиться на:

unsigned char c = -3;

И поставьте под сомнение цель такой инициализации, которая противоречива - использование -3 для инициализации беззнакового символа.

-3 - целое число со знаком. Если для представления этого значения используются величина знака / дополнение / два дополнения, то -3 (int) требует более одного байта для представления. Это значение при присваивании неподписанному символу вызовет переполнение, которое приведет к неопределенному поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...