以-2>>>32为例,为什么-2无符号右移32位后仍为-2,而不是0?探讨Java中位移32位为什么等于原数。
【摘要】 位移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)