c++ - 左移带有可变误差

标签 c++ c undefined-behavior bit-shift bitmask

我正在尝试创建一个掩码,但是当我计算 shift 的值并将其放入变量中时,我得到了错误的结果。看:

#include <stdio.h>

int main(){
        int shift = 32 ;
        printf("%d\n",shift);   //32
        int mask = 0xFFFFFFFF << shift;
        printf("%x\n",mask);     //ffffffff      
        mask = 0xFFFFFFFF << 32;
        printf("%x\n",mask); //00000000
        return 0;
}

有人知道为什么会发生这种情况吗?

最佳答案

如果您的系统有 32 位或更小的 int,那么您会导致 undefined behaviour通过移位 32 位或更多。移位的位数必须少于类型的位数。

如果你有 64 位 int,那么 0xFFFFFFFF 将是一个有符号 int,将其移位 32 位会将 1 移动到符号位,这会导致 UB在 C 中,以及在 C++14 之前的 C++ 中。 (从 C++14 开始,这会导致实现定义的行为)。

如果在 64 位情况下按计划进行移位,

printf("%x\n",mask); 也会触发 UB,因为 %x 需要非负值,但您将传递负 int。为了避免这种情况,请改用unsigned int mask

当你触发UB时,任何事情都可能发生,包括但不限于无意义的输出,以及相同的操作给出不同的结果。

关于c++ - 左移带有可变误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30677965/

相关文章:

python - 使用Ctypes在Python程序中调用call by reference c程序

c - 未从 LPM3 唤醒,ACLK 故障

c++ - 对象切片或 UB 风险?

c - 为什么这些构造使用增量前和增量后未定义的行为?

C++ Boost.Asio 对象生命周期

c++ - 有效 C++ : discouraging protected inheritance?

c++ - 具有不同签名的绑定(bind)函数

c - 使用 strtok 读取 csv 文件

c++ - 类型删除工作或失败取决于优化级别

c++ - 如果我中断调试,Visual Studio 会释放内存吗?