Пазл по продвижению типа C от короткого до международного - PullRequest
5 голосов
/ 09 мая 2011

У меня есть вопрос, который требует руководства от любого эксперта:

  1. Поскольку значение с типом short передается в качестве аргумента функции printf(), оно будет автоматическиповышен до типа int, поэтому функция printf() будет видеть значение как тип int вместо типа short.

  2. Таким образом, тип short16-битная ширина, которая 0000000000000000, в то время как int тип 32-битная, что 00000000000000000000000000000000.

  3. Допустим, я объявляю вызов переменной num сshort введите и инициализируйте его значением -32, что означает, что старшие биты типа short будут 1, то есть 0000000011100000.

  4. Когда я передаю это значение в printf(), оно будет преобразовано в тип int, поэтому оно станет 00000000000000000000000011100000.

  5. На шаге 4, когда оно преобразуетсядо int, самый старший бит - 0.

  6. Почему, когда я использую спецификатор %hd или даже спецификатор %d, он все равно будет запрашивать меня?для отрицательного vалю вместо положительного?

Ответы [ 3 ]

9 голосов
/ 09 мая 2011

Нет, short и int являются обоими типами со знаком, поэтому этому способствует расширение знака, а не заполнение 0 байтов:

-32 short =                   11111111 11100000 
-32 int   = 11111111 11111111 11111111 11100000

, оставляя MSB равным 1, т.е. отрицательным.

Youможет подделать поведение, которое вы ожидаете, сначала применив его без знака, например

printf("%d", (unsigned short)((short)(-32)));
2 голосов
/ 09 мая 2011

Как вы говорите, он конвертируется, и конверсия в этом случае подразумевает знание закона.То есть компилятор знает, как работает преобразование с подписью в int.Он не просто добавляет биты впереди, он создает новый тип int с тем же значением, что и у short.Вот почему вы получаете правильный номер.

2 голосов
/ 09 мая 2011

Преобразование короткого в целое в основном копирует самый значимый бит короткого замыкания в верхние 16 бит целого. Вот почему int печатается как отрицательный. Если вы не хотите использовать это поведение с помощью ushort.

...