以-2>>>32为例,为什么-2无符号右移32位后仍为-2,而不是0?探讨Java中位移32位为什么等于原数。

举报
布莱星特 发表于 2021/06/27 08:06:05 2021/06/27
【摘要】 位移32位仍为原数

        按java位运算符的定义 >> 意思是各二进制位右移n位,正数前面补0,负数前面补1;<< 意思是各二进制位左移n位,后边位补0,>>> 表示无符号右移n位,无论正负数,前面都补0。

        以-2>>>32为例,按Java位运算符定义,-2的二进制无符号右移32位,-2的二进制10000000 00000000 00000000 00000010,在计算机中的补码为11111111 11111111 11111111 11111110,无符号向右移32为后的二进制补码为00000000 00000000 0000000 00000000,对应的十进制为0,即-2>>>32 = 0 。

        但是,实际编译后的十进制结果为-2,二进制补码为11111111 11111111 11111111 11111110。源码和输出结果如下:

源码:

输出结果:

       分析原因:在java虚拟机中,执行-2>>>(32)时,实际是执行-2>>>(32%32),因为计算机默认32位运算,“()”内的位移数据实际与默认32位进行模运算,余数为几就右移几位。所以本例子中实际是右移0位,所以-2>>>(32)结果仍为-2 。同理:“>>” “<<” “>>>” 也遵循这个原理。

       结论:在java的位运算中,输入运算位数实际是先与计算机默认运算位数32进行模运算,求得余数才是计算机执行移动位数。


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。