右移有符号整数

use*_*777 4 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;
}
Run Code Online (Sandbox Code Playgroud)

这里对于num的正值,我得到预期的结果.但是使用num can的负值,t找到给出我的程序的干运行的答案.举个例子考虑我给num = -1所以-1将表示为1111111111111111并且右移1应该产生输出0111111111111111,即十进制形式的32767.但输出为-1.

R S*_*ahu 13

从C99标准N1256(强调我的):

6.5.7按位移位运算符

5 E1 >> E2的结果是E1右移E2位的位置.如果E1具有无符号类型或者E1具有有符号类型和非负值,则结果的值是E1 X 2 E2的商的整数部分.如果E1具有带符号类型和负值,则结果值是实现定义的.

  • 而且,为了完整起见,这在C89和C11中是相同的. (4认同)

oua*_*uah 6

右移负值的行为是在C中定义的实现.

因为gcc,从文档中,符号位被传播(强调我的):

(4.5整数)对有符号整数进行一些按位运算的结果(C90 6.3,C99和C11 6.5)

按位运算符作用于值的表示,包括符号和值位,其中符号位被立即考虑在最高值位之上.签名">>"通过符号扩展对负数进行处理.

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