我把-109移了5位,我想是-3,因为
-109=-1101101(二进制)
右移5位
-1101101>>5=-11(二进制)=-3
但是,我改成了-4。
有人能解释一下怎么回事吗?
我使用的代码:

int16_t a = -109;
int16_t b = a >> 5;
printf("%d %d\n", a,b);

我在linux上使用GCC,在osx上使用clang,结果是一样的。

最佳答案

问题是你没有正确地考虑负数表示对于右移位,移位类型(算术或逻辑)取决于要移位的值的类型如果将值转换为无符号值,则可能会得到所需的结果:

int16_t b = ((unsigned int)a) >> 5;

您在示例中使用的是-109(16位)109位是:
00000000 01101101

如果你服用s1092补体,你会得到:
11111111 10010011

然后,您将数字右移5:
__int16_t a = -109;
__int16_t b = a >> 5; // arithmetic shifting
__int16_t c = ((__uint16_t)a) >> 5; // logical shifting
printf("%d %d %d\n", a,b,c);

将产生:
-109 -4 2044

08-15 22:21