我发现输出总是在下面的代码中带有负号,尽管我指出变量x
的位用于启动语句中的无符号整数。
为什么~x
产生一个带负号的数字,而没有为第一个地方反映的数字符号指定位?
#include <stdio.h>
void main() {
unsigned int x = 11;
printf("not x=%d", ~x);
}
答案 0 :(得分:1)
此行为取决于平台,但基本答案是printf
不知道您传递的内容被声明为unsigned。这只是一个价值。如果使用%d
格式,则该值将被解释为有符号整数。如果您使用%u
,则会将其解释为无符号。在使用二进制补码表示的处理器上,具有最高有效位设置的值为负。由于~11
设置了该位,因此显示为负数。
答案 1 :(得分:0)
这是关于printf给你传递的参数的解释。
unsigned int x = 11;
printf("not x=%d", ~x);
在函数调用期间,默认参数提升会将~x传递给printf作为unsigned int类型。由于printf签名中的va_args,将应用默认参数提升。
此外,整数促销用于计算〜{ - 来自6.5.3.3 Unary arithmetic operators:
〜运算符的结果是它的按位补码 (提升)操作数(也就是说,结果中的每个位都是设置的 如果未设置转换后的操作数中的相应位)。该 对操作数执行整数提升,结果为 推广类型。如果提升的类型是无符号类型,则 表达式~E等于其中可表示的最大值 类型减去E.
所以你传递一个无符号整数,但是 printf会将它转换为int ,因为%d期望找到一个int。