#include<stdio.h>
int main()
{
int num;
printf("enter the numbern");
scanf("%d",&num);
int a,b;
printf("enter the number of bits yiu want to shiftn");
scanf("%d",&b);
a=num>>b;
printf("a is=%dn",a);
return 0;
}
在这里,对于 num 的正值,我得到了预期的结果。但是对于 num 的负值,找不到答案来试运行我的程序。只是一个例子,考虑我给 num=-1因此,-1 将表示为 1111111111111111 将其右移 1 应该产生十进制形式的输出0111111111111111为 32767。但输出为 -1。
来自 C99 标准 N1256(强调我的(:
6.5.7 按位移位运算符
5 E1
>>
E2 的结果是 E1 右移 E2 位位置。如果 E1 具有无符号类型,或者 E1 具有有符号类型和非负值,则结果的值是 E1 X 2E2 商的整数部分。如果 E1 具有有符号类型和负值,则结果值由实现定义。
右移负值的行为是 C 中定义的实现。
对于gcc
,从文档中,符号位被传播(强调我的(:
(4.5 整数(对有符号整数(C90 6.3、C99 和 C11 6.5(进行一些按位运算的结果
按位运算符作用于值的表示形式,包括符号位和值位,其中符号位被视为紧靠最高值值位的上方。有符号的">>"通过符号扩展作用于负数。
在其他实现中,一些小型嵌入式平台不会传播符号位,但大多数实现会传播它。