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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Diferay 于 2014-2-27 00:39 编辑

关于[负数]做[移位运算]的问题


题目:   ( byte类型) -3>>2


步骤:   a. 3的二进制                          0000-0011

           b. 取反加1得到-3的二进制    1111-1101

           c. -3>>2 向右移两位得到      1111-1111  也就是 -1



结论:   -3>>2  =  -1



问题 :   -3>>2 相当于除以2的2次幂 -3/(2*2) = 0 与结论冲突


所以 :   -3>>2 到底要怎么算呢  结果是 -1 还是 0?

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 elq7xy 于 2014-2-23 22:47 编辑

00000011是3,-3的原码为10000011,-3的反码为11111100,-3的补码为11111101,向右位移2位变为11111111,补码变反码11111110,反码变原码
10000001,为-1.-3/3(2*2)=-1

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
elq7xy 发表于 2014-2-23 22:39
00000011是3,-3的原码为10000011,-3的反码为11111100,-3的补码为11111101,向右位移2位变为11111111,补 ...

前面两行 我也推出来了  得出结果是 -1,
然后不是说 >>n 就是除以 2的n次幂吗?
请问你回答的最后一行是什么意思呀,
"-3/3(2*2)=-1 "
为什么出来个 -3 / 3 ?
回复 使用道具 举报
-3/(2*2) = 0 与结论冲突 这一块你搞错了, -3/2*2=-0.75,不是约等于0,而是约等于-1.初中问题,我开始也蒙了

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
-3/2*2在java中取整是0,但是在数学上是-1, 主要看一种语言的定义规则怎么定义。
回复 使用道具 举报
本帖最后由 Silvester 于 2014-2-27 00:52 编辑

刚看到问题我有个猜想,会不会 /运算时计算机执行的是逻辑移位(即>>>),而>>是算术移位,但查阅资料也没权威的说法,暂时放一边,请楼主看以下程序:
1. 编程测试:System.out.println(-3 >> 2);  
                     System.out.println(-3 >>> 2);  
输出结果为:-1
                    1073741823
2.  编程测试:System.out.println(-3/(2*2));              
输出结果为:0
3. 编程测试:byte a = -3;
                     byte b;
                     b = a/(2*2);
                     System.out.println(b);
编译未通过,报错:
                             错误:可能损失精度
                             b =a/(2*2);
                             需要:byte
                             找到:int
在2中的除法运算-3/(2*2)均为int类型,把a, b定义为byte以后或损失精度
4. 编程测试:byte a = -3;
                     byte b;
                     b =(byte)(a/(2*2));
                     System.out.println(b);
输出结果:0
(4)的结果和(2)的结果结果相等,感觉好像问题出在类型定义上,不过具体的原理没理顺,就暂时能回答到这,正在思考中,希望有人能解惑。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
Silvester 发表于 2014-2-27 00:38
刚看到问题我有个猜想,会不会 /运算时计算机执行的是逻辑移位(即>>>),而>>是算术移位,但查阅资料也没 ...

今天在J<ava核心技术 第八版 卷Ⅰ(基础篇)>这本电子书上看到,int取整的方式是将小数点部分去掉。-1.7=-1了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马