C++ 带布尔变量的按位NOT

C++ 带布尔变量的按位NOT,c++,boolean,bit-manipulation,operator-keyword,C++,Boolean,Bit Manipulation,Operator Keyword,我是位运算符和布尔类型的初学者。我可能错了,但我认为bool类型是以1位表示的,可以从{0,1}中获取值。所以,我用这样一个变量尝试了NOT(~)操作符,结果对我来说很奇怪。 为了 boolx=0; cout大多数处理器没有1位宽的通用寄存器,因此当您使用布尔值时,它会占用该平台上的默认寄存器大小(即目前大多数Intel和ARM计算机上的64位,但在某些嵌入式系统上可能是32位)。当你否定一个全是零的东西时,你得到了所有的1。在这种情况下,有符号小数的计算结果为-1。长话短说,布尔值实际上是一个

我是位运算符和布尔类型的初学者。我可能错了,但我认为bool类型是以1位表示的,可以从{0,1}中获取值。所以,我用这样一个变量尝试了NOT(~)操作符,结果对我来说很奇怪。 为了

boolx=0;

cout大多数处理器没有1位宽的通用寄存器,因此当您使用布尔值时,它会占用该平台上的默认寄存器大小(即目前大多数Intel和ARM计算机上的64位,但在某些嵌入式系统上可能是32位)。当你否定一个全是零的东西时,你得到了所有的1。在这种情况下,有符号小数的计算结果为-1。长话短说,布尔值实际上是一个整数,~0是-1

大多数处理器没有一个1位宽的通用寄存器,因此当您使用布尔值时,它会占用该平台上的默认寄存器大小(即目前大多数Intel和ARM计算机上的64位,但在某些嵌入式系统上可能是32位)。当你否定一个全是零的东西时,你得到了所有的1。在这种情况下,有符号小数的计算结果为-1。长话短说,你的布尔值实际上是一个整数,~0是-1

这个
运算符是逻辑运算符-因此0(false)被反为1(true)


~
运算符是位运算符-因此每一位都被求反。一个
bool
,虽然名义上是一个位,但可能会导致类型为
int
的表达式。因此,您实际上是在否定
0..000
,这是
1…111
,这是-1(见两个的补码)。

这是
运算符是逻辑运算符-因此0(false)被反为1(true)


~
运算符是位运算符-因此每一位都被求反。一个
bool
,虽然名义上是一个位,但可能会导致类型为
int
的表达式。因此,您实际上是在否定
0..000
,这是
1…111
,它是-1(见两个补码)。

当在表达式
~x
中使用时,
bool
x
是一个
int
。绝大多数计算机使用有符号整数表示,其中
~0
等于-1


运算符,以便
!x
的类型为
bool
而不是
int
,因此不会出现此问题。

当在表达式
~x
中使用时,
bool
x
int
。绝大多数计算机使用有符号整数表示,其中
~0
等于-1


运算符,以便
!x
的类型为
bool
而不是
int
,因此不会出现此问题。

说明需要稍微调整。并非所有的编译器实现都使用twos补码。解释需要一些微调。并非所有的编译器实现都使用twos补码。
    bool x = 0;
    cout << (~x);