首页 > 解决方案 > 为什么全宽移位对于常量和变量的行为不同?

问题描述

如果我使用3 << 32,我会得到正确的结果。如果我使用 找到大小sizeof(int),乘以 8,将结果存储在变量中,然后使用3 << variable,我会得到不同的结果。我在这里想念什么?

void func()
{
    unsigned int sz = sizeof(number) * 8;
    unsigned int k = 0;
    printf("Value of sz is %u \r\n",sz);
    k = (k | (0x3) << sz);
    printf("Value of 2_1_MSB is %d \r\n",(3 << 32));
     printf("Value of k is %u \r\n",k);
}

标签: cbit-shift

解决方案


C 标准仅针对小于被移位类型宽度的移位定义移位行为 (C 2018 6.5.7 3)。int标准未定义将 32 位移位32 位。

3 << 32和之间的差异(0x3) << sz可能是由于编译器在编译时评估前者(可能使用将所有位移出的操作,导致为零)和后者在执行时(可能使用仅使用低五位的指令)移位量,导致无移位)。不得依赖此类行为;它们可能会随着优化、目标或其他编译器配置的改变、编译器版本的改变等而改变。


推荐阅读