黑马程序员技术交流社区

标题: 右移操作符的问题 [打印本页]

作者: zhudong100    时间: 2015-11-16 12:50
标题: 右移操作符的问题
  1. int main(int argc, char* argv[])
  2. {
  3.         short i = -1;
  4.         i = i>>15;
  5.         printf("i = %d\n",i);

  6. }
复制代码

右移后,不是补充符号位吗?为什么结果还是-1呢?
作者: pq1051288217    时间: 2015-11-16 13:02
这个问题很常见
作者: lujia1010    时间: 2015-11-16 13:12
负数右移空位补1,不是补0
作者: zhudong100    时间: 2015-11-19 10:47
lujia1010 发表于 2015-11-16 13:12
负数右移空位补1,不是补0

补1后为什么还是-1?-1的二进制码:1000 0000 0000 0001 按你说的,右移一位后:1100 0000 0000 0001是不?
作者: lujia1010    时间: 2015-11-19 18:58
-1的二进制是1111 1111 1111 1111 1111 1111 1111 1111
作者: 能不能行    时间: 2015-11-19 19:01
右移符号位是不变的吧
作者: wkop    时间: 2015-11-20 17:39
我的理解:计算机存储的是一个数的二进制补码,短整型-1的二进制补码是11111111 11111111,该补码右移15位后是1,高位补符号位,结果是11111111 1111111,换算成十进制仍是-1。
作者: 陈同英    时间: 2015-11-21 00:08
赞一个~赞一个~赞一个~赞一个~赞一个~
作者: 打滚的橘子    时间: 2015-11-21 04:48
计算机储存是以2进制补码储存的。我也特意查过右移,找到比较合理的解释是,进行位移操作的时候,计算机会判断是进行逻辑位移还是算术位移,逻辑位移就是直接移动,补0,算术位移会补1。
作者: zhudong100    时间: 2015-11-23 09:55
wkop 发表于 2015-11-20 17:39
我的理解:计算机存储的是一个数的二进制补码,短整型-1的二进制补码是11111111 11111111,该补码右移15位 ...

正解,谢谢!
作者: 且笑着    时间: 2015-11-24 01:24
要注意计算机存储的二进制的形式是补码,需要转换成原码再计算十进制的数值到底是多少
作者: 罗文强    时间: 2015-11-25 23:21
右移是符号位不变,剩余位整体右移




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2