2015-05-17 3 views
1

Я не могу заставить его работать в CodeBlocks Что будет печатать этот код? :Передача отрицательного значения «% hu» в C

printf("%hu" , ‐1); 
+2

Когда вы говорите, что вы «не можете заставить его работать», что вы подразумеваете под этим? –

+4

Это Неопределенный ... возможный результат заключается в том, что ваша программа окрашивает потолок желтого цвета. – pmg

+0

Вы можете [прочитать это] (http://stackoverflow.com/questions/19842215/wrap-around-explanation-for-signed-and-unsigned-variables-in-c). –

ответ

3

Это напечатает 65535

"%hu" является unsigned short int, который 16 бит.

-1 является "all-ones", например. 0xffff.ffff, но так как он преобразуется в короткий, это только 0xffff. Который 65535 как неподписанный.

+0

Примечание: 'unsigned short int ', который является 16-битным, часто является истинным, но не определенным C. C определяет' unsigned short int' быть в _least_ 16 бит. '-1 - это« все-одни », также очень часто истинно (дополнение 2), но не определено C так. – chux

+0

@chux - Правда. В принципе мы не можем сказать, что будет печатать код без знания используемой системы. Тем не менее, я уверен, что в большинстве систем там используется 16 бит для шорт и 2-го дополнения для целых чисел со знаком. – 4386427

0

Печать без знака короткая.

Printf читает переменные аргументы, поэтому он не имеет понятия, какой параметр должен быть до тех пор, пока он не попытается отформатировать его. -1 будет передаваться в printf как целое число, потому что компилятор ничего не может сделать (посмотрите type promotion). Это значение будет равно -1 (0xFFFFFFFF на 32-битной системе).

Аргумент форматирования вызывает короткое замыкание без знака, поэтому целое число будет усечено до -1 (0xFFFF в 32-разрядной системе) и будет выводиться без знака (65535 в 32-разрядной системе).

Смежные вопросы