C++对bool类型变量使用~按位取反运算符得到非预期-2输出问题
问题原因解析
你得到-2的输出是C++的类型提升规则和你对bool类型的认知偏差共同导致的,具体逻辑如下:
- 首先纠正你对bool存储的错误认知:C++标准仅规定bool类型的
false转换为整数时值为0,true转换为整数时值为1,并没有要求true的底层存储必须是全1比特位。你给bool变量b赋值1时,b会被设置为true,主流编译器下其单字节存储的实际值为0b00000001,而非你以为的0b11111111。 - 核心原因是整数提升规则:C++中
~这类位运算符作用于操作数时,所有宽度小于int的类型(包括bool、char、short等)都会先被提升为int类型,再执行运算。bool类型提升时,true会直接转换为int类型的整数值1,false转换为int类型的整数值0。 - 具体运算过程:
- bool变量
b值为true,参与~运算前先提升为4字节(绝大多数主流平台int长度为4字节)int值1,对应二进制为0b00000000 00000000 00000000 00000001 - 对该int值执行按位取反,得到补码表示的二进制
0b11111111 11111111 11111111 11111110 - 该补码对应的有符号int值就是
-2,std::cout接收到这个int类型的运算结果后直接输出,就得到了你看到的结果。
- bool变量
补充说明:如果你想要得到bool值取反的结果,应该使用逻辑非运算符
!而非按位取反运算符~:对值为true的b执行!b会得到false,对应输出0。即使你显式绕开整数提升,对单字节的bool存储值直接做按位取反,得到的单字节值为0b11111110(也就是十进制254),这个非零值转换回bool时依然是true,完全达不到取反bool值的效果。
内容的提问来源于stack exchange,提问作者aamir pashah
相关产品推荐
相关产品推荐

