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.
%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 int或unsigned short int参数(该参数将已经根据整数促销促进,但它的值应该是转换为short int或unsigned short int在打印之前); 或者以下n转换说明符适用于指向short int参数的指针.
强调我的.
所以,行为并非未定义; 如果其中一个i或~i不是整数类型,它将只是未定义.
| 归档时间: |
|
| 查看次数: |
694 次 |
| 最近记录: |