右移有符号整数

时间:2015-02-23 18:50:17

标签: c

#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。

2 个答案:

答案 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;'按符号扩展对负数采取行动。

在其他实现中,一些小型嵌入式平台不会传播符号位,但大多数实现都会传播它。