加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

为什么Java中的整数为-1零填充右移1 = 2147483647?

发布时间:2020-12-14 05:51:19 所属栏目:Java 来源:网络整理
导读:对于以下程序: public class ZeroFillRightShift{ public static void main(String args[]) { int x = -1; int y = x1; System.out.println("x = " + x); System.out.println("y = " + y); }} 我得到的输出如下: x = -1y = 2147483647 我得到-1 1的结果是2
对于以下程序:
public class ZeroFillRightShift
{
  public static void main(String args[])
  {
    int x = -1;
    int y = x>>>1;
    System.out.println("x = " + x);
    System.out.println("y = " + y);
  }
}

我得到的输出如下:

x = -1
y = 2147483647

我得到-1>>> 1的结果是2147483647.如果这是符号位必须被移位,据我所知,结果应该是1073741824.为什么是2147483647呢?

以下图像更清楚地说明了我的问题:

解决方法

The unsigned right shift operator “>>>” shifts a zero into the
leftmost position,while the leftmost position after “>>” depends on
sign extension.

所以,-1以零扩展向右移位一位,这意味着它会将0插入最左边的位置.记住,我们在这里处理two’s complement:

-1为:22222222222222222222222222222211或十六进制0xFFFFFFFF

-1>>> 1是十六进制中的02222222222222222222222222222221或0x7FFFFFFF,它是231 – 1 == 2147483647

以下是shift operators的JLS参考.

你似乎对两个人的补充感到困惑.该值用于31位,并且最左边的位用于符号.由于你只是移位1位,有符号位变为0,这意味着正数,结果是最大的正数,而不是int可以表示.

也许另一个例子会有所帮助.我们来考虑一下:

System.out.println(-2 >> 1); //prints -1

-2 = 2222222222222222222222222222221110

如果我们使用已签名的右移,我们得到:22222222222222222222222222222211,这是-1.但是,如果我们这样做:

System.out.println(-2 >>> 1); //prints 2147483647

由于-2 = 22222222222222222222222222222210并进行无符号右移,这意味着我们以零扩展方式移位1位,给出:022222222222222222222222221111

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读