📅  最后修改于: 2023-12-03 15:36:42.590000             🧑  作者: Mango
在 Java 中,由于数据存储需要占用一定的空间,当给一个变量赋值时,如果赋给它的值超出了它所能表示的范围,就会发生溢出(overflow)。
对于基本数据类型的整数,Java 中有四种类型:byte
、short
、int
和 long
。它们分别占用 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 中的浮点数有两种类型:float
和 double
,分别占用 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
在上面的代码中,f1
、f2
、d1
和 d2
都表示浮点数的最大值或最小值。在进行乘法或除法运算时,发生了浮点数的上溢或下溢,导致结果变成了正无穷或负无穷。