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

时间:2018-05-10 18:20:00

标签: c++ bit-manipulation

请考虑我要检查无符号整数变量中所有位的代码示例。 IntegerType被uint8_t,uint16_t,uint32_t uint64_t取代。

问题:为什么在uint16_t和uint8_t失败的情况下断言成功为IntegerType = uint32_t和uint64_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);

1 个答案:

答案 0 :(得分:5)

这是由整数提升引起的:第一个表达式将~bitset转换回较短的类型,而第二个表达式使用完整的整数值。

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

考虑uint16_t作为示例。当你写

uint16_t t = ~bitset;

bitset的值被提升为int,因此在32位平台上变为0x0000FFFF。然后应用~,生成0xFFFF0000。最后,结果被写回t,切断高位。因此,t为零。

另一方面,当您直接将~bitset与零进行比较时,比较失败,因为0xFFFF0000不为零。