我是使用按位运算符和bool类型的初学者。我可能错了,但我认为bool类型在1位上表示并且可以从{0,1}获取值。所以,我尝试使用这样一个变量的NOT(〜)运算符,结果对我来说很奇怪。 例如。为了
bool x = 0;
cout << (~x);
我得-1。 (我预计1)你能告诉我我错在哪里,为什么只有!运算符确实反转了该值(从0到1,从1到0)?
答案 0 :(得分:1)
大多数处理器没有1位宽的通用寄存器,因此当你使用布尔值时,它会占用该平台上的默认寄存器大小(即大多数英特尔和ARM计算机上的64位,但可能是32位)在一些嵌入式系统上)。当你否定一些全为零的东西时,你得到全部的1。在twos complement中,这将以带符号的十进制计算为-1。长话短说,你的bool实际上是一个int而且〜0是-1
答案 1 :(得分:0)
!
运算符是逻辑运算符 - 因此0(false)被否定为1(true)。
~
运算符是一个按位运算符 - 因此每个位都被否定。 bool
虽然在概念上是单个位,但可以生成int
类型的表达式。因此,你真的否定0.....000
,即1...111
,即-1(见两个补码)。
答案 2 :(得分:0)
在bool
表达式中使用时,x
值int
为implicitly converted ~x
。绝大多数计算机使用two's complement表示有符号整数,其中~0
等于-1。
!
运算符的定义是!x
类型bool
而不是int
,所以这个问题不会发生。