gpt4 book ai didi

java - 为什么 Integer.MIN_VALUE 的绝对值等于 Integer.MIN_VALUE

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

在 Java 中,当我说 Integer i = Math.abs(Integer.MIN_VALUE) 时。我得到与答案相同的值,这意味着 i 包含 Integer.MIN_VALUE。我也在 C++ 中验证了相同的内容。

为什么会这样?

最佳答案

阅读 Joshua Bloch 的 Effective Java。

我找到了这个问题的答案,这里是解释:计算机使用二进制运算,Java 中的Math.abs 或任何语言中的absolute 函数的逻辑如下:

if(num >= 0)
return num;
else
return (2's complement of the num);

注意:如何求2的补数

对于一个给定的数,我们先求它的补码,然后再对它加 1。例如假设我们的号码是 101011 的补码 = 010102 的补码 = 01011(1 的补码加 1)

现在,为了简单明了,假设我们的整数(有符号)大小为 3 位,那么这里是可以使用这 4 位生成的可能的数字列表:

000 --> 0 (0)
001 --> 1 (1)
010 --> 2 (2)
011 --> 3 (3)
100 --> 4 (-4)
101 --> 5 (-3)
110 --> 6 (-2)
111 --> 7 (-1)

既然这是有符号的,这意味着一半的数字是负数,另一半是正数(负数是第一个位为 1 的数字)。让我们从 000 开始,并尝试找到它的负数,它将是 000 的二进制补码。

2's complement of `000` = 1 + `111` = `000`
2's complement of `001` = 1 + `110` = `111`
2's complement of `010` = 1 + `101` = `110`
2's complement of `011` = 1 + `100` = `101`
2's complement of `100` = 1 + `011` = `100`
2's complement of `101` = 1 + `010` = `011`
2's complement of `110` = 1 + `001` = `010`
2's complement of `111` = 1 + `000` = `001`

从上面的演示,我们发现111(-1)的2的补码是001(1),同理110(-2)的2的补码是010(2)101(-3) 的 2 的补码是 011(3)100(-4) 的 2 的补码是 100(-4) 我们可以看到 -4 是可能使用 3 位的最小负数。

这就是为什么 Integer.MIN_VALUE 的绝对值是 Integer.MIN_VALUE 的原因。

关于java - 为什么 Integer.MIN_VALUE 的绝对值等于 Integer.MIN_VALUE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18565485/

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