#include<stdio.h>
int main()
{
int num;
printf("enter the number\n");
scanf("%d",&num);
int a,b;
printf("enter the number of bits yiu want to shift\n");
scanf("%d",&b);
a=num>>b;
printf("a is=%d\n",a);
return 0;
}
这里对于num的正值,我得到预期的结果。但是使用num can的负值,t找到给出我的程序的干运行的答案。 举个例子,考虑我给num = -1 因此-1将表示为1111111111111111并将其右移1应产生输出0111111111111111,即十进制形式的32767.但输出为-1。
答案 0 :(得分:13)
来自C99标准N1256(强调我的):
6.5.7按位移位运算符
5 E1
>>
E2 的结果是 E1 右移 E2 位位置。如果 E1 具有无符号类型或 E1 具有有符号类型和非负值,则结果的值是 E1 X的商的整数部分2 E2 即可。 如果 E1 具有签名类型和负值,则结果值是实现定义的。
答案 1 :(得分:6)
右移负值的行为是在C中定义的实现。
对于gcc
,来自documentation的符号位会被传播(强调我的):
(4.5整数)对有符号整数进行一些按位运算的结果(C90 6.3,C99和C11 6.5)
按位运算符作用于值的表示,包括符号和值位,其中符号位被认为位于最高值位之上。 签名'&gt;&gt;'按符号扩展对负数采取行动。
在其他实现中,一些小型嵌入式平台不会传播符号位,但大多数实现都会传播它。