gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:22 24 4
gpt4 key购买 nike

对于下面的程序:

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 sample image

最佳答案

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 是:11111111111111111111111111111111 或十六进制的 0xFFFFFFFF

-1 >>> 1 在十六进制中是 011111111111111111111111111111110x7FFFFFFF
即 231 - 1 == 2147483647

这是 shift operators 的 JLS 引用.

您似乎对二进制补码感到困惑。 31 位用于值,最左边的位用于符号。由于您只移动 1 位,因此带符号的位变为 0,这意味着正数,结果是 int 可以表示的最大正数。

也许另一个例子会有所帮助。让我们考虑以下几点:

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

-2 = 1111111111111111111111111111110

如果我们使用有符号右移,我们得到:11111111111111111111111111111111,即 -1。但是,如果我们这样做:

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

因为 -2 = 11111111111111111111111111111110 并进行无符号右移,这意味着我们以零扩展移位 1 位,给出:01111111111111111111111111111111

关于java - 为什么 -1 零填充右移 1=2147483647 对于 Java 中的整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20439767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com