C中的Tilde算子

Gre*_*ack 4 c int unsigned short

 unsigned short int i = 0;
 printf("%u\n",~i);
Run Code Online (Sandbox Code Playgroud)

为什么此代码在控制台中返回32位数字?它应该是16位,因为short是2个字节.

输出为4,294,967,295,应为65,535.

Joh*_*ode 5

%u期待一个unsigned int; 如果你想打印unsigned short int,请使用%hu.

编辑

Lundin是正确的,在传递之前~i将被转换为类型. 也被转换为传递给可变函数.但是,如果使用转换说明符,则会将参数转换回打印前:intprintfiintprintfunsigned short%hu

7.21.6.1 fprintf函数
...
3格式应为多字节字符序列,以其初始移位状态开始和结束.格式由零个或多个指令组成:普通的多字节字符(不是%),它们不加改变地复制到输出流中; 和转换规范,每个转换规范导致获取零个或多个后续参数 ,根据相应的转换说明符转换它们(如果适用),然后将结果写入输出流.
...
7的长度调节剂和它们的含义是:
...
h用于指定后续的d,i,o,u,x,或X转换说明适用于一个 short intunsigned short int参数(该参数将已经根据整数促销促进,但它的值应该是转换为short intunsigned short int在打印之前); 或者以下n转换说明符适用于指向short int参数的指针.

强调我的.

所以,行为并非未定义; 如果其中一个i~i不是整数类型,它将只是未定义.