5

可能重复:
为什么 Java Number 数据类型不会溢出?

在Java中,当继续增加一个Byte值并且当它超过大小容量时,为什么它不抛出任何运行时异常?例如:

public static void main(String[] args) {
    byte b = 127;
    ++b;
    System.out.println(b);
}

上面的代码将打印-128. 扔了不是更好RuntimeException吗?为什么要这样设计?

其他原始类型的情况也相同,对于Integer

int c = 2147483647;
++c;
System.out.println(c);

上面的代码打印-2147483648

4

3 回答 3

7

整数溢出实际上在计算中非常有用。如果它抛出异常,许多聪明的算法会突然崩溃或变得不切实际。例如,任何涉及定点算术的事情都会突然受到异常的困扰。

问题是,溢出通常不是问题,因为我们在程序中设置了限制以防止它发生(如果它会导致问题)。其他时候,我们设计程序来专门利用它。

不要将溢出视为“超过其最大大小的值”。这在技术上是不可能的。这些位只是环绕并保持在该数据类型的限制内。

如果你需要检查溢出并想产生异常,你可以这样做:

byte b = 127;
byte oldb = b;
b++;
if( b < oldb ) {
    // Calamity!!!  Raise an exception!
}

不要害怕你的整数限制。学会理解他们并与他们合作。

于 2012-07-31T04:33:16.980 回答
1

JVM Specs中有说明:“尽管可能发生溢出,但执行 iadd 指令永远不会引发运行时异常。”

于 2012-07-31T04:32:26.303 回答
1

整数和浮点运算的工作方式基于相同的操作在 C 中的工作方式,这取决于 CPU 通常的工作方式。上溢或下溢不会触发异常(不幸的是,还有一些标志是 java 无法访问的) 只有一个操作会触发异常,即整数除以零会触发多种 CPU 上的处理器中断。浮点除以零被定义为非数字,因此这不会触发中断。

于 2012-07-31T07:20:56.457 回答