Tag: bit shift

正确的位移给出错误的结果,有人可以解释

我正在向-109右移-109,我期望-3,因为-109 = -1101101(二进制)右移5位-1101101 >> 5 = -11(二进制)= -3 但是,我得到-4而不是。 有人可以解释什么是错的吗? 我使用的代码: int16_t a = -109; int16_t b = a >> 5; printf(“%d %d\n”, a,b); 我在linux上使用了GCC,并在osx上使用了相同的结果。

当b大于a中的位数时,右移(a >> b)的未定义行为?

显然,右移操作的行为: a >> b 当b >= sizeof(a)*CHAR_BIT时,在C和C ++中未定义(而在正常情况下,由于右移而从左侧引入的“新位”等于零)。 当b >= sizeof(a)*CHAR_BIT时,为什么这种未定义的行为比将结果设置为零更好?

当sizeof(int)== 4时,1 << 31在C中定义得很好

根据这个问题的答案: E1 << E2的结果是E1左移E2位位置; 腾出的位用零填充。 如果E1具有无符号类型,则结果的值为E1×2 E2 ,比结果类型中可表示的最大值减少一个模数。 如果E1具有带符号类型和非负值,并且E1×2 E2可在结果类型中表示,那么这就是结果值; 否则,行为是未定的。 这似乎意味着1 << 31未定义。 但是,如果我使用1 << 31 GCC不会发出警告。 它确实为1 << 32发出一个。 链接 那是哪个呢? 我误解了这个标准吗? 海湾合作委员会有自己的解释吗?