在java中,当我说Integer i = Math.abs(Integer.MIN_VALUE).我得到与答案相同的值,这意味着i包含Integer.MIN_VALUE.我也在C++中验证了相同的内容.
为什么会这样?
dha*_*ram 12
请阅读Joshua Bloch撰写的Effective Java中的内容.
我找到了这个问题的答案,这里是解释:计算机使用二进制算术,Math.absjava中的逻辑或absolute任何语言的函数如下所示:
if(num >= 0)
return num;
else
return (2's complement of the num);
Run Code Online (Sandbox Code Playgroud)
注意:如何找到2的补码
对于给定的数字,我们首先发现它是1的补码,然后加1.例如,考虑我们的数字为10101
1的补码= 01010
2的补数= 01011(在1的补码中加1)
现在,为了使其简单明了,我们假设我们的整数(带符号)大小是3位,那么这里是可以使用四位产生的数字列表:
000 --> 0 (0)
001 --> 1 (1)
010 --> 2 (2)
011 --> 3 (3)
100 --> 4 (-4)
101 --> 5 (-3)
110 --> 6 (-2)
111 --> 7 (-1)
Run Code Online (Sandbox Code Playgroud)
现在这已经签名,这意味着一半的数字是负数而另一半是正数(负数是第一位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`
Run Code Online (Sandbox Code Playgroud)
从上面的演示中,我们发现2的补码111(-1) is 001(1),2的补码110(-2) is 010(2),2的补码101(-3) is 011(3)和2的补码,100(-4) is 100(-4)并且我们可以看出-4是使用3位可能的最小负数.
这就是为什么绝对的理由Integer.MIN_VALUE是Integer.MIN_VALUE.
存在固有的不对称性是这种效应的根本原因.32位位模式的数量是偶数.其中一种模式用于零.这留下了奇数个非零值.正值的数量和负值的数量不能相等,因为它们的总和是奇数.
在用于Java整数的2的补码表示中,负数的数量比正数的数量大1.除Integer.MIN_VALUE之外的每个负数对应于正数,该正数既是其否定值,也是其绝对值.Integer.MIN_VALUE保留,没有相应的正int.Math.abs和否定将它映射到自身.
| 归档时间: |
|
| 查看次数: |
3032 次 |
| 最近记录: |