请考虑我要检查无符号整数变量中所有位的代码示例。 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);
答案 0 :(得分:5)
这是由整数提升引起的:第一个表达式将~bitset
转换回较短的类型,而第二个表达式使用完整的整数值。
对于短于int
的整数类型,在执行操作之前,值会被提升为int
,在这种情况下,应用~
之前。
考虑uint16_t
作为示例。当你写
uint16_t t = ~bitset;
bitset
的值被提升为int
,因此在32位平台上变为0x0000FFFF
。然后应用~
,生成0xFFFF0000
。最后,结果被写回t
,切断高位。因此,t
为零。
另一方面,当您直接将~bitset
与零进行比较时,比较失败,因为0xFFFF0000
不为零。