为什么当bool = true时补码运算符不起作用?

Why is the complement operator not working when bool = true?

本文关键字:补码 运算符 不起作用 true bool 为什么      更新时间:2023-10-16

我写了这个c++程序,我不明白为什么在第三个cout语句中打印1

#include<iostream>
using namespace std;
int main()
{
    bool b = false;
    cout << b << "n";  // Print 0
    b = ~b;
    cout << b << "n"; // Print 1
    b = ~b;
    cout << b << "n"; // Print 1 **Why?**
    return 0;
}
输出:

0
1
1

为什么不打印以下内容?

0
1
0

这是由于C传统操作器机械化(还记得~补码)。~的整型操作数在执行操作之前被提升为int,然后再转换回bool。所以有效地你得到的是(使用无符号32位表示)false -> 0 -> 0xFFFFFFFF -> truetrue -> 1 -> 0xFFFFFFFE -> 1 -> true

您正在寻找!运算符来反转布尔值

您可能想这样做:

b = !b;

是逻辑否定。您所做的是将bool转换为整数的按位否定。第二次执行语句b = ~b;时,b的前一个值是true。将1转换为整数,其按位补码为-2,因此将true转换为bool类型。因此,btrue值将保持true,而false值将分配给true。这是由于C的遗留问题。

正如大多数人所说的那样,在补算符完成工作之前,bool值被提升为整数。~是位运算符,因此对整数的每个位进行反转;如果对00000001应用~,结果是11111110。当你把它应用到一个32位有符号整数时,~1得到-2。如果你不知道为什么,只要看看二进制转换器。例如:http://www.binaryconvert.com/result_signed_int.html?decimal=045050

对于你修改后的问题:

从False到true的工作原理与上述相同。如果你把00000000(转换成32位),你会得到11111111…我认为是-1的整数形式。当比较布尔值时,任何非- 0的值都被认为是真值,而0单独为假。

应该使用逻辑运算符,而不是二进制运算符。使用!代替~