我遇到了这个问题。 这个C代码的输出是什么?
#include <stdio.h>
int main()
{
unsigned int a = 10;
a = ~a;
printf("%d\n", a);
}
我知道代字号操作符的作用,现在10可以用二进制表示为1010,如果我按位不是它,我得到0101,所以我不明白输出-11。谁能解释一下?
答案 0 :(得分:3)
这是未定义的行为,因为"%d"
用于有符号整数;对于未签名的,请使用"%u"
。
否则,请注意负值通常表示为二进制补码;所以-a == (~a)+1
,或者相反:(~a) == -a -1
。因此,(~10)
与-10-1
相同,即-11
。
答案 1 :(得分:3)
按位否定将不导致0101
。请注意,int包含至少16位。因此,对于16位,它将生成:
a = 0000 0000 0000 1010
~a = 1111 1111 1111 0101
因此我们希望看到一个大数字(16位为65'525),但您使用 %d
作为格式说明符。这意味着您将整数解释为 signed 整数。现在签名的整数使用two-complement representation [wiki]。这意味着设置最高位的每个整数都是负数,而且在这种情况下,该值等于-1-(~x)
,因此-11
。如果说明符为 %u
,则格式为 unsigned 整数。
编辑:喜欢@R。他说,只有无符号整数才能很好地定义%d
,如果这些整数也在 signed 整数的范围内,那么它取决于实现。
答案 2 :(得分:1)
无符号十进制整数的格式说明符为%u
。 %d
用于带符号的十进制整数。
printf("%d\n", a)
将a
解释为已签名的int。你想要printf("%u\n", a)
。