unsigned short int i = 0;
printf("%u\n",~i);为什么这段代码在控制台中返回一个32位数字?它应该是16位,因为短是两个字节。
产出为4,294,967,295,应为65,535。
发布于 2014-11-25 14:27:40
当您将一个参数传递给printf,且该参数的整数类型比int短时,它将根据K&R参数提升规则隐式地提升到int。因此,您的printf-call实际上表现为:
printf("%u\n", (int)~i);请注意,这是未定义的行为,因为您告诉printf参数具有unsigned类型,而int实际上是有符号的类型。将i转换为unsigned short,然后转换为unsigned以解决未定义的行为和问题:
printf("%u\n", (unsigned)(unsigned short)~i);发布于 2014-11-25 14:41:02
N1570 6.5.3.3一元算术运算符p4:
~运算符的结果是其(提升)操作数的位补(也就是说,结果中的每个位都是当且仅当转换后的操作数中的对应位没有设置)。整数提升在操作数上执行,结果具有提升类型。.
小于int的整数类型被提升为int。如果是sizeof(unsigned short) == 2和sizeof(int) == 4,则结果类型是int。
而且,printf转换说明符%u需要unsigned int,因此int的表示被解释为unsigned int。你基本上是在对编译器撒谎,这是未定义的行为。
发布于 2014-11-25 14:29:14
这是因为printf()的参数是以文字形式放入堆栈中的,因为printf内部没有办法知道参数是短的。另外,通过使用%u格式,您只是在声明您正在传递一个无符号数字。
https://stackoverflow.com/questions/27129184
复制相似问题