Folia
← 返回头版

C++位运算在布尔值和枚举类型上的反直觉行为引发关注

C++中对布尔值进行按位取反操作会产生令人困惑的结果。1根据C++标准([conv.bool]),转换到bool类型时,零值转为false,非零值转为true。1当对true执行按位取反操作时,true首先被提升为int类型(值为1),其补码为-2,再转换回bool后仍为true。1这种反直觉的现象源于整数提升的强制性——小于int的整数类型在位运算中必然被提升到int进行操作。1

不同编译器在处理这类操作时表现不一。1GCC编译器存在长期一致性漏洞,在处理enum class boolean : bool中的~boolean::TRUE时会错误地评估为boolean::FALSE,而Clang和MSVC则按标准正确评估所有四种补码和转换组合的结果为true。1此外,对于无固定底层类型的非作用域枚举,情况更加复杂。1这类枚举的有效值范围为M宽度整数,其中M为表示所有枚举子所需的最小位数,将位运算结果转换回此类枚举可能引发未定义行为,特别是当转换值超出枚举的有效范围时。1浮点数转换为bool型枚举时,GCC和Clang的行为与标准规范不符,可能产生越界的比特模式。1


评论