【发布时间】:2013-11-18 22:41:54
【问题描述】:
当然,Java 没有“无符号”长值,但有时有符号长值被有效地视为无符号长值(例如,System.nanoTime() 的结果)。从这个意义上说,算术溢出并不意味着值的溢出,而是意味着 64 位表示的溢出。例子:
Long.MAX_VALUE * 2L // overflows the signed product but not the unsigned product
Long.MAX_VALUE * 4L // overflows the signed product and the unsigned product
-1L * 2L // overflows the unsigned product but not the signed product
测试乘法是否溢出似乎有些复杂,因为运算的符号会妨碍。请注意,任何负值乘以除 0 或 1 以外的任何值都会溢出无符号乘积,因为负值的最高位已设置。
确定两个“无符号”长值(实际上是有符号长值)的乘积是否会溢出 64 位表示的最佳方法是什么?使用BigInteger 的实例是一个明显的解决方案,我得出了一个仅涉及原始操作的复杂测试,但我觉得我遗漏了一些明显的东西。
【问题讨论】:
-
我认为
System.nanoTime()不需要总是返回正值。 -
正是我的观点。它返回相对于某些未指定来源的值,这意味着负值与正值一样合法。实际上,System.nanoTime() 返回的值可以被认为是无符号的(或符号无关的)。
-
哦,我明白了。这为问题增加了另一个维度,我只考虑了正值的一半......
标签: java long-integer multiplication integer-overflow unsigned-integer