📜  例如:Java 中的溢出(1)

📅  最后修改于: 2023-12-03 15:36:42.590000             🧑  作者: Mango

Java 中的溢出

在 Java 中,由于数据存储需要占用一定的空间,当给一个变量赋值时,如果赋给它的值超出了它所能表示的范围,就会发生溢出(overflow)。

整数溢出

对于基本数据类型的整数,Java 中有四种类型:byteshortintlong。它们分别占用 1、2、4 和 8 个字节的空间,能够表示的范围从最小值到最大值如下:

| 类型 | 最小值 | 最大值 | | ----- | --------------------------- | --------------------------- | | byte | -128 | 127 | | short | -32768 | 32767 | | int | -2147483648 | 2147483647 | | long | -9223372036854775808 | 9223372036854775807 |

如果给一个变量赋的值超出了它所能表示的范围,那么就会发生整数溢出。

int a = 2147483647;
System.out.println(a + 1);  // -2147483648

在上面的例子中,由于 a 的值已经是 int 类型所能表示的最大值,在加上 1 以后就会发生整数溢出,导致结果变成了 int 类型所能表示的最小值。

浮点数溢出

Java 中的浮点数有两种类型:floatdouble,分别占用 4 和 8 个字节的空间。它们能够表示不同的精度,但都有相应的最大值和最小值。

在 Java 中,浮点数的溢出有两种情况:一种是上溢(overflow),即超过了最大值;另一种是下溢(underflow),即小于了最小值。具体情况如下:

| 类型 | 最大值 | 最小值 | | ------ | --------------------------------- | --------------------------------------- | | float | 3.40282347E+38f | -3.40282347E+38f | | double | 1.7976931348623157E+308 | -1.7976931348623157E+308 |

float f1 = 3.40282347E+38f;
System.out.println(f1 * 2);  // Infinity

float f2 = -3.40282347E+38f;
System.out.println(f2 / 2);  // -Infinity

double d1 = 1.7976931348623157E+308;
System.out.println(d1 * 2);  // Infinity

double d2 = -1.7976931348623157E+308;
System.out.println(d2 / 2);  // -Infinity

在上面的代码中,f1f2d1d2 都表示浮点数的最大值或最小值。在进行乘法或除法运算时,发生了浮点数的上溢或下溢,导致结果变成了正无穷或负无穷。