【发布时间】:2016-12-08 16:18:10
【问题描述】:
我发现在下面的代码中输出总是带有负号,尽管我指出变量x 的位是用于初始化语句中的无符号整数。
为什么~x 会产生一个负符号数,而没有为要首先反映的数字符号分配位?
#include <stdio.h>
void main() {
unsigned int x = 11;
printf("not x=%d", ~x);
}
【问题讨论】:
标签: c unsigned-integer
我发现在下面的代码中输出总是带有负号,尽管我指出变量x 的位是用于初始化语句中的无符号整数。
为什么~x 会产生一个负符号数,而没有为要首先反映的数字符号分配位?
#include <stdio.h>
void main() {
unsigned int x = 11;
printf("not x=%d", ~x);
}
【问题讨论】:
标签: c unsigned-integer
这种行为取决于平台,但基本答案是printf 不知道您传递的东西被声明为无符号。这只是一个值。如果您使用%d 格式,该值将被解释为有符号整数。如果您使用%u,它将被解释为无符号。在使用二进制补码表示的处理器上,设置了最高有效位的值是负数。由于~11 设置了该位,因此显示为负数。
【讨论】:
这是关于 printf 对您传递的参数的解释。
unsigned int x = 11;
printf("not x=%d", ~x);
在函数调用期间,默认参数提升会将 ~x 作为 unsigned int 类型传递给 printf。由于 printf 签名中的 va_args 应用了默认参数提升。
此外,整数提升 用于计算 ~x -- 来自6.5.3.3 Unary arithmetic operators:
~ 运算符的结果是它的按位补码 (提升)操作数(即,结果中的每一位都被设置当且仅 如果未设置转换后的操作数中的相应位)。这 对操作数执行整数提升,结果有 提升的类型。如果提升的类型是无符号类型,则 表达式 ~E 等价于可表示的最大值 键入减 E。
所以你传递了一个无符号整数,但是 printf 会将它转换为 int,因为 %d 期望找到一个 int。
【讨论】: