让我们看看这个例子
考虑这个值1111 1111 1111 1111
如果你的编译器是 16 位的,你做了右移
值将变为1111 1111 1111 1110
如果你的编译器是 32 位的并且你做了右移
值将变为0000 0000 0000 0001 1111 1111 1111 1110
你做了相同值的右移,但你会得到不同的结果,具体取决于你的编译器。
使用 %x 打印十进制值的十六进制表示法。
查看此代码:
#include <stdio.h>
main()
{
int y=-01;
printf("%d\n",y);
printf("%x\n",y);
y<<=3;
printf("%d\n",y);
printf("%x\n",y);
y>>=3;
printf("%d\n",y);
printf("%x\n",y);
y=127;
printf("%d\n",y);
printf("%x\n",y);
y<<=3;
printf("%d\n",y);
printf("%x\n",y);
y>>=3;
printf("%d\n",y);
printf("%x\n",y);
y=32767;
printf("%d\n",y);
printf("%x\n",y);
y<<=3;
printf("%d\n",y);
printf("%x\n",y);
y>>=3;
printf("%d\n",y);
printf("%x\n",y);
getchar();
}
在 64 位机器上输出:
-1
噗噗噗
-8
ffffff8
-1
噗噗噗
127
7f
1016
3f8
127
7f
32767
7fff
262136
3fff8
32767
7ff
在 32 位机器上输出:
-1
噗噗噗
-8
ffffff8
-1
噗噗噗
127
7f
1016
3f8
127
7f
32767
7fff
-8
ffffff8
-1
咳咳咳
当达到 32 位有符号整数的最大值时,您会发现编译器对移位的依赖性。
这里用 1 和 2 的补码表示来解释 8 位有符号整数
Signed number representations