【问题标题】:Strange behaviour on dividing -ve int/-ve int ,in java在java中划分-ve int / -ve int的奇怪行为
【发布时间】:2014-09-17 07:52:15
【问题描述】:

虽然我对 java 并不陌生,但前几天我观察到了这种奇怪的行为。我通过运行由基本算术运算组成的代码来刷新我的基础知识。现在根据java(以及算术的基本规则),-ve * -ve OR -ve / -ve 是一个+ve 数字。

但是编译这个源码:-

int b = Integer.MIN_VALUE / -1;
System.out.println("b:  " + b);

给我输出:-

b:-2147483648

-ve 是哪个,谁能指出我有什么问题?我知道这一定是我无法注意到的小事。

【问题讨论】:

  • -2147483648 / -1 => 2147483648 => 溢出 => -2147483648
  • @MateuszDymczyk 这是答案
  • 有趣的事实:一个好的 IDE 会告诉你溢出(刚刚检查)
  • @MateuszDymczyk 谢谢,这很简单 :D ,但我的 IDE 没有发出警告。 (日食开普勒 sr2)

标签: java


【解决方案1】:

除以-1等于取反。

由于整数的范围(-2147483648 到 2147483647)在负数的幅度上大 1 -Integer.MIN_VALUE 等于 Integer.MAX_VALUE+1 溢出回到 Integer.MIN_VALUE

System.out.println(Integer.MIN_VALUE == -Integer.MIN_VALUE); // prints 'true'

【讨论】:

    【解决方案2】:

    你有一个溢出。根据 java 规范,符号不保证溢出。

    溢出是由于

    Integer.MIN_VALUE = -2147483648;
    Integer.MAX_VALUE = 2147483647;
    

    所以 -2147483648*(-1) 是 2147483648,超过了最大值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多