在Java中,当我说Integer i = Math.abs(Integer.MIN_VALUE)
。我得到与答案相同的值,即i
包含Integer.MIN_VALUE
。我已经在C
++中验证了同样的内容。
为什么会这样呢?
阅读Joshua Bloch撰写的Effective Java中的内容。
我找到了这个问题的答案,这里是解释:计算机使用二进制算术工作,Math.abs
java或absolute
任何语言的函数的逻辑如下:
if(num >= 0)
return num;
else
return (2's complement of the num);
注意:如何找到2的补码
对于给定的数字,我们首先找到它的补数,然后再加1。例如,假设我们的数字是10101
1的补数= 01010
2的补数=
01011
(将1加到1的补数中)
现在,为了使它变得简单明了,让我们说我们的Integer(signed)大小为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`
从上面的演示中,我们发现的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
。
问题内容: 考虑下面的java代码。 输出量 价值的负值如何产生相同的价值? 但是结果不能是因为java中Integer的最大值是。 但是想知道为什么吗?内部正在发生哪种按位运算? 问题答案: 内部正在发生哪种按位运算? Java使用带符号数字的二进制补码表示。因此,更改符号操作包括两个步骤: 反转原始值的位,并 添加到结果中。 的表示如下: 反转产生 加法使其再次成为相同的数字,即 由于整数溢出
问题内容: 是真的。 我知道Java中的整数是32位,并且不能超过2 31 -1,但是我不明白为什么要在其结果中加1 而不是某种例外。更不用说像Ruby这样的透明转换为更大的类型了。 是否在某处指定了此行为?我可以依靠吗? 问题答案: 因为整数溢出。溢出时,下一个值为。相关JLS 如果整数加法溢出,则结果是数学和的低阶位,以某种足够大的二进制补码格式表示。如果发生溢出,则结果的符号与两个操作数值的
问题内容: 这段代码: 退货 它不应该将绝对值返回为吗? 问题答案: 是,但32位整数可以包含的最大值是。尝试以32位int表示将有效地“翻转”到。这是因为,使用符号的整数时,两个补的二进制表示和是相同的。但是,这不是问题,因为超出了范围。 有关此问题的更多信息,您可能需要查看Two的补语中的Wikipedia文章。
问题内容: 使用Python 3: 我想检查是否相等: 但: 您知道为什么值不相等吗? 我已经使用Python 3.4和3.5进行了测试。 提出这个问题之后,我在Python-Ideas邮件列表中发布了更多详细信息: https://mail.python.org/pipermail/python- ideas/2015-December/037472.html 问题答案: 在Python 3中,
问题内容: 正如hibernate文档所述,在进行批处理插入/更新时,当对象数量等于jdbc批处理大小()时,应刷新并清除会话。我的问题是,为什么该数字应等于。有表演技巧吗? 编辑: 例如,我在hibernate.cfg文件中将其设置为30。然后,正如文档所说,当对象计数等于30时,应刷新会话。为什么当对象计数为20或40时不刷新? 问题答案: JDBC批处理包括以下步骤: 将插入语句添加到批处理