我对Java中System.nanoTime()方法文档中的以下语句很感兴趣:
long t0 = System.nanoTime();
...
long t1 = System.nanoTime();
应该使用t1 - t0 < 0
,而不是t1 < t0
,因为数字溢出的可能性 。
来源:http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#nanoTime()
为什么t1 < t0
可能“溢出”?这是在Javadocs中,但我想它适用于任何语言。
答案 0 :(得分:2)
<
可能不会溢出,而t2
可能会溢出。
十六进制的示例,因为溢出在十六进制中很明显。
说你致电System.nanoTime()
,结果是0x7FFFFFFF00000000
。这非常接近long
的最大值。这是t1
。
几秒钟后,您再次拨打电话,然后获取0x8000000011111111
。这非常接近long
的最小值 - 这意味着它比你得到的第一个值小得多!这是t2
。
如果您选中了t2 < t1
,则会获得false
,因为t2
确实小于t1
。
如果你计算差值t2 - t1
,这也会溢出,但它会发生这总是取消第一次溢出(如果有的话)。结果是0x0000000111111111
,这是正确的时差。这大于0,因此t2 - t1 > 0
会返回true
。
答案 1 :(得分:1)
除了immibis所说的,这个来源解释了&lt; b和a-b&lt; 0大长:
long t1 = Long.MAX_VALUE;
long t2 = Long.MIN_VALUE;
//should have the same result with small longs, but is different when rotating from max value to min value of Long
System.out.println(t1 - t2 < 0); //true
System.out.println(t1 < t2); //false
//should have the same result
System.out.println(t1 - t2 > 0); // false
System.out.println(t1 > t2); //true
System.out.println(t2 - t1); // 1 => 1 nanosecond of difference
由于纳米水中的时间可以超过“长”大小,当时间到达最大值时,它再次开始到最小值。因此MAX_VALUE结束MIN_VALUE
之间存在1纳秒的差异