当字节超出大小时为什么没有溢出?

时间:2012-07-31 04:19:11

标签: java size overflow byte

  

可能重复:
  Why don't Java Number datatypes overflow?

在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

3 个答案:

答案 0 :(得分:7)

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

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

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

如果您需要检查溢出并想要生成异常,可以执行以下操作:

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

整数和浮点运算的工作方式基于C中相同的操作如何工作,这基于CPU通常如何工作。溢出或下溢不会触发异常(其他有标记,遗憾的是java无法访问)只有一个操作触发异常,并且整数除以零会触发许多类型的cpus上的处理器中断。浮点除以零被定义为非数字,因此不会触发中断。