在下面的代码中,
#include <stdio.h>
#include<conio.h>
main()
{
int y=-01;
y<<=3;
printf("%d\n",y);
y>>=3;
printf("%d",y);
getch();
}
我在一本书中读到,在 y 上使用右移运算符时,有符号位可能会保留也可能不会保留,具体取决于我的编译器。这是为什么?这背后的概念是什么?请详细说明。
最佳答案
有些处理器只有“无符号”右移(用 0 填充符号位)或有符号右移(用当前符号位的副本填充大小位)。由于某些处理器只有一个或另一个,而不是两个,因此该标准不会尝试强制执行一种行为或另一种行为。
就其值(value)而言,许多(大多数?)当前的处理器都有执行这两项操作的指令。例如,x86 包括 shr
(逻辑右移——用 0 填充)和 sar
(算术右移——用符号位的副本填充)。
关于右移运算符对符号类型的编译器依赖性 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18492653/