C 中波浪号运算符查询的工作方式不同
tilde operator query in C working differently
我遇到了这个问题。
此 C 代码的输出是什么?
#include <stdio.h>
int main()
{
unsigned int a = 10;
a = ~a;
printf("%d\n", a);
}
我知道波浪号运算符的作用,现在 10 可以用二进制表示为 1010,如果我按位不是它,我得到 0101,所以我不明白输出 -11。谁能解释一下?
无符号十进制整数的格式说明符是 %u
。 %d
用于带符号的十进制整数。
printf("%d\n", a)
将 a
解释为有符号整数。你想要 printf("%u\n", a)
.
这是未定义的行为,因为 "%d"
用于有符号整数;对于无符号的,使用 "%u"
.
否则,请注意,负值通常表示为二进制补码;所以 -a == (~a)+1
,或者反过来:(~a) == -a -1
。因此,(~10)
与 -10-1
相同,即 -11
。
按位取反 不会导致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
仅适用于无符号整数,如果它们也在 有符号 整数的范围内,则在外部取决于实现。
我遇到了这个问题。 此 C 代码的输出是什么?
#include <stdio.h>
int main()
{
unsigned int a = 10;
a = ~a;
printf("%d\n", a);
}
我知道波浪号运算符的作用,现在 10 可以用二进制表示为 1010,如果我按位不是它,我得到 0101,所以我不明白输出 -11。谁能解释一下?
无符号十进制整数的格式说明符是 %u
。 %d
用于带符号的十进制整数。
printf("%d\n", a)
将 a
解释为有符号整数。你想要 printf("%u\n", a)
.
这是未定义的行为,因为 "%d"
用于有符号整数;对于无符号的,使用 "%u"
.
否则,请注意,负值通常表示为二进制补码;所以 -a == (~a)+1
,或者反过来:(~a) == -a -1
。因此,(~10)
与 -10-1
相同,即 -11
。
按位取反 不会导致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
仅适用于无符号整数,如果它们也在 有符号 整数的范围内,则在外部取决于实现。