c++ - 为什么小于 4 字节的整数类型的位操作会出现异常?

标签 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);

最佳答案

这是由于整数提升而发生的:第一个表达式将 ~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/

相关文章:

algorithm - 创建整数数据结构并查找给定整数位于哪个组件

C++ 多态性——调用具有不同签名的派生类方法

c++ - 使用异步函数提升 asio 编译错误

c# - C++ 应用程序和 Xamarin Forms 应用程序之间的实时消息传递框架

c - 按位排除值

c - 二进制数的反转函数

c++ - 在对类型名 T 进行模板化时,T() 是什么意思?

c++ - `using`和直接插的区别

将数字字符串转换为以二进制表示的字节数组

c - 基本的按位(我认为)或示例?