unsigned short int i = 0;
printf("%u\n",~i);
Why does this code return a 32 bit number in the console? It should be 16 bit, since short is 2 bytes.
The output is 4,294,967,295 and it should be 65,535.
%u
expects an unsigned int
; if you want to print an unsigned short int
, use %hu
.
EDIT
Lundin is correct that ~i
will be converted to type int
before being passed to printf
. i
is also converted to int
by virtue of being passed to a variadic function. However, printf
will convert the argument back to unsigned short
before printing if the %hu
conversion specifier is used:
7.21.6.1 The fprintf function
...
3 The format shall be a multibyte character sequence, beginning and ending in its initial shift state. The format is composed of zero or more directives: ordinary multibyte characters (not%
), which are copied unchanged to the output stream; and conversion specifications, each of which results in fetching zero or more subsequent arguments, converting them, if applicable, according to the corresponding conversion specifier, and then writing the result to the output stream.
...
7 The length modifiers and their meanings are:
...h
Specifies that a followingd
,i
,o
,u
,x
, orX
conversion specifier applies to ashort int
orunsigned short int
argument (the argument will have been promoted according to the integer promotions, but its value shall be converted toshort int
orunsigned short int
before printing); or that a followingn
conversion specifier applies to a pointer to ashort int
argument.
Emphasis mine.
So, the behavior is not undefined; it would only be undefined if either i
or ~i
were not integral types.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With