具有布尔变量的按位NOT

时间:2016-11-01 22:16:33

标签: c++ boolean bit-manipulation operator-keyword

我是使用按位运算符和bool类型的初学者。我可能错了,但我认为bool类型在1位上表示并且可以从{0,1}获取值。所以,我尝试使用这样一个变量的NOT(〜)运算符,结果对我来说很奇怪。 例如。为了

    bool x = 0;
    cout << (~x);

我得-1。 (我预计1)你能告诉我我错在哪里,为什么只有!运算符确实反转了该值(从0到1,从1到0)?

3 个答案:

答案 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表达式中使用时,xintimplicitly converted ~x。绝大多数计算机使用two's complement表示有符号整数,其中~0等于-1。

!运算符的定义是!x类型bool而不是int,所以这个问题不会发生。