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

Kar*_*hik 5 java size byte overflow

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

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

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

上面的代码将打印出来-128.如果抛出它会不会更好RuntimeException?为什么这样设计?

对于其他原始类型也是如此Integer:

int c = 2147483647;
++c;
System.out.println(c);
Run Code Online (Sandbox Code Playgroud)

上面的代码打印出来-2147483648.

pad*_*ddy 7

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

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

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

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

byte b = 127;
byte oldb = b;
b++;
if( b < oldb ) {
    // Calamity!!!  Raise an exception!
}
Run Code Online (Sandbox Code Playgroud)

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


And*_*yuk 1

JVM 规范中指出:“尽管可能发生溢出,但 iadd 指令的执行绝不会引发运行时异常。”