为什么小于4字节的整数类型的位操作出乎意料?

Fab*_*ian 0 c++ bit-manipulation

请考虑我想要检查无符号整数变量中的所有位是否都已设置的代码示例.IntegerType由uint8_t,uint16_t,uint32_t uint64_t取代.

问题:为什么断言成功为IntegerType = uint32_t和uint64_t而uint16_t和uint8_t失败?

#include <cstdint>
#include <cassert>

IntegerType bitset = -1; // set all bits to true

IntegerType t = ~bitset;
bool bAllBitsSet1 = (t == 0);
bool bAllBitsSet2 = ((~bitset) == 0);

assert(bAllBitsSet1 == bAllBitsSet2);
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

这是由于整数提升而发生的:第一个表达式转换~bitset回较短的类型,而第二个表达式使用完整的整数值.

对于比执行操作之前int提升的值更短的整数类型int,在这种情况下,在应用之前~.

考虑uint16_t一个例子.当你写作

uint16_t t = ~bitset;
Run Code Online (Sandbox Code Playgroud)

bitset提升的值int,因此它变为0x0000FFFF32位平台.然后~应用,生产0xFFFF0000.最后,结果被写回t,切断高位.因此,t为零.

另一方面,当您~bitset直接与零比较时,比较失败,因为0xFFFF0000不是零.