int a = 1 << 32;
int b = 1 << 31 << 1;
为什么a == 1?b是我预期的0.
有人可以解释为什么以下按位表达式返回不同的结果:
System.out.println((-1<<31)<<1); // it prints 0
System.out.println(-1<<32); // it prints -1
Run Code Online (Sandbox Code Playgroud) 这个问题的灵感来自 StackOverflow 的其他问题。今天,在浏览 StackOverflow 时,我遇到了一个问题,即将变量按值 k 进行位移,该值 >= 该变量的位宽。这意味着将 32 位 int 移位 32 位或更多位。
从这些问题中可以明显看出,如果我们尝试将数字移位 >= 变量位宽的 k 位,则仅采用最低有效 log2k 位。对于 32 位 int,最低有效 5 位被屏蔽并作为移位量。
因此,一般来说,如果 w = 变量的位宽,
x >> k则变为x >> (k % w)
对于 an int,则为x >> (k % 32)。
计数被屏蔽为 5 位,这将计数范围限制为 0 到 31。
所以我编写了一个小程序来观察理论上应该产生的行为。我在评论中写下了最终的偏移量 % 32。
#include <stdio.h>
#include <stdlib.h>
#define PRINT_INT_HEX(x) printf("%s\t%#.8x\n", #x, x);
int main(void)
{
printf("==============================\n");
printf("Testing x …Run Code Online (Sandbox Code Playgroud)