请考虑我要检查是否设置了无符号整数变量中的所有位的代码示例。 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);
最佳答案
这是由于整数提升而发生的:第一个表达式将 ~bitset
转换回较短的类型,而第二个表达式使用完整的整数值。
对于短于 int
的整数类型,值在执行操作之前被提升为 int
,在这种情况下,在对其应用 ~
之前.
以 uint16_t
为例。当你写作时
uint16_t t = ~bitset;
bitset
的值被提升为 int
,因此它在 32 位平台上变为 0x0000FFFF
。然后应用 ~
,生成 0xFFFF0000
。最后,结果被写回 t
,切掉高位。因此,t
为零。
另一方面,当您将 ~bitset
直接与零进行比较时,比较失败,因为 0xFFFF0000
不为零。
关于c++ - 为什么小于 4 字节的整数类型的位操作会出现异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50279197/