为什么对小于 4 个字节的整数类型的位操作会发生意外行为?
Why does bit operation on integer types smaller than 4 bytes behave unexpectedly?
请考虑代码示例,其中我想检查是否设置了无符号整数变量中的所有位。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++避免位操作完全移位
- 使用双包装器类进行位操作(C++、clang)修复性能下降问题
- 使用位操作优化检查
- 子集相关位操作
- 使用 c++ 提升库的按位操作
- 位操作和异或
- 位操作将最左侧的设置位转换为右侧交替位?
- 为什么对小于 4 个字节的整数类型的位操作会发生意外行为?
- POD 类型的原子按位操作
- 如何使用位操作在单个整数中编码和解码两个数字
- __int128的位操作
- 使用位操作会影响内存消耗?
- 在具有位操作的函数中获得值
- C/C 位操作不会导致预期输出
- 在数组大小中使用位操作的原因
- 了解C++位操作中的二进制转换实现