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 仅适用于无符号整数,如果它们也在 有符号 整数的范围内,则在外部取决于实现。