怎么能“<”或“>”运营商溢出?

时间:2014-07-15 09:16:26

标签: java jvm operators overflow nanotime

我对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中,但我想它适用于任何语言。

2 个答案:

答案 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纳秒的差异