A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhudong100 中级黑马   /  2015-11-16 12:50  /  1706 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. int main(int argc, char* argv[])
  2. {
  3.         short i = -1;
  4.         i = i>>15;
  5.         printf("i = %d\n",i);

  6. }
复制代码

右移后,不是补充符号位吗?为什么结果还是-1呢?

11 个回复

倒序浏览
pq1051288217 来自手机 中级黑马 2015-11-16 13:02:40
沙发
这个问题很常见
回复 使用道具 举报
负数右移空位补1,不是补0
回复 使用道具 举报
lujia1010 发表于 2015-11-16 13:12
负数右移空位补1,不是补0

补1后为什么还是-1?-1的二进制码:1000 0000 0000 0001 按你说的,右移一位后:1100 0000 0000 0001是不?
回复 使用道具 举报
-1的二进制是1111 1111 1111 1111 1111 1111 1111 1111
回复 使用道具 举报
右移符号位是不变的吧
回复 使用道具 举报
wkop 中级黑马 2015-11-20 17:39:56
7#
我的理解:计算机存储的是一个数的二进制补码,短整型-1的二进制补码是11111111 11111111,该补码右移15位后是1,高位补符号位,结果是11111111 1111111,换算成十进制仍是-1。
回复 使用道具 举报
赞一个~赞一个~赞一个~赞一个~赞一个~
回复 使用道具 举报
计算机储存是以2进制补码储存的。我也特意查过右移,找到比较合理的解释是,进行位移操作的时候,计算机会判断是进行逻辑位移还是算术位移,逻辑位移就是直接移动,补0,算术位移会补1。
回复 使用道具 举报
wkop 发表于 2015-11-20 17:39
我的理解:计算机存储的是一个数的二进制补码,短整型-1的二进制补码是11111111 11111111,该补码右移15位 ...

正解,谢谢!
回复 使用道具 举报
要注意计算机存储的二进制的形式是补码,需要转换成原码再计算十进制的数值到底是多少
回复 使用道具 举报
右移是符号位不变,剩余位整体右移
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马