我把-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
如果你服用s
109
2补体,你会得到: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