问答详情
源自:2-3 什么是位运算?

a为5,为什么取反后c的值不是2呢?

a的二进制是101,那么取反应该是010,十进制为2,为什么c输出的值为-6呢?

https://img1.sycdn.imooc.com/66f3f8f00001b5e809480631.jpg

提问者:秋瑾的瑾_adkqH2 2024-09-25 19:51

个回答

  • AI小慕
    2024-11-05 14:28:11

    核心问题解答

    在C++中,整数(如int类型)通常使用补码表示法来存储负数。对于正数5,其二进制表示为00000101(假设这是一个8位的整数)。当你对这个数取反(即按位取反),得到的是11111010

    但是,由于计算机使用补码表示法,这个结果实际上代表的是-6。这是因为:

    1. 首先,找到6的补码表示。6的二进制表示为00000110
    2. 然后,将6的二进制表示取反,得到11111001
    3. 最后,将取反的结果加1,得到11111010

    因此,11111010在补码表示法中代表的是-6,而不是2。

    修复后的代码

    在这个例子中,代码本身没有错误,因为它正确地展示了取反操作的结果。如果你希望看到取反后的二进制表示,可以修改代码如下:

    #include <stdio.h>
    #include <bitset>
    
    int main(int argc, char **argv)
    {
        int a = 5;
        int c;
        printf("a的值为:%d\n", a);
        c = ~a;
        printf("c的值为:%d\n", c);
        std::bitset<8> binary_c(c);
        printf("c的二进制表示为:%s\n", binary_c.to_string().c_str());
        return 0;
    }
    

    这段代码会输出c的二进制表示,帮助你更好地理解取反操作的结果。