布尔变量的位不

Bitwise NOT with boolean variable

本文关键字:变量 布尔      更新时间:2023-10-16

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

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

得到-1。你能告诉我哪里错了吗?为什么只有……操作符反转值(从0到1和从1到0)?

大多数处理器没有1位宽的通用寄存器,所以当你使用布尔值时,它会占用该平台上的默认寄存器大小(即目前大多数英特尔和ARM计算机上的64位,但在某些嵌入式系统上可能是32位)。当你取一个全为0的数为负时,你得到的都是1。在二进制补码中,该值在有符号十进制中为-1。长话短说,你的bool实际上是一个int, ~0是-1

!运算符是一个逻辑运算符,因此0 (false)被反为1 (true)。

~运算符是位运算符,因此每个位都是负的。一个bool,虽然理论上是一个位元,但可以产生int型的表达式。因此,您实际上是否定0.....000,这是1...111,这是-1(见2的补)。

boolx在表达式~x中使用时隐式转换为int。绝大多数计算机使用二进制补码表示有符号整数,其中~0等于-1。

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