C语言中的波浪运算符查询工作方式不同

时间:2017-12-11 22:57:24

标签: c operators tilde

我遇到了这个问题。 这个C代码的输出是什么?

#include <stdio.h>

    int main()
    {
        unsigned int a = 10;
        a = ~a;
        printf("%d\n", a);
    }

我知道代字号操作符的作用,现在10可以用二进制表示为1010,如果我按位不是它,我得到0101,所以我不明白输出-11。谁能解释一下?

3 个答案:

答案 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)