C++ 带布尔变量的按位NOT
我是位运算符和布尔类型的初学者。我可能错了,但我认为bool类型是以1位表示的,可以从{0,1}中获取值。所以,我用这样一个变量尝试了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。长话短说,布尔值实际上是一个
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);