对java中int类型的基本数据类型的理解和溢出的本质
我们都知道,在java中int类型的数据占4个字节,一个字节8位,也就是32位,最高位是符号位,1代表负数,0代表正数,取值范围是 (-2)31 ~ 231-1。很多的初学者难以理解取值范围为什么是这个范围,接下来笔者用最简单的叙述让读者深刻理解int类型在计算机中的存储。
为了更加简单而又轻松的理解,这里假设int类型只有4位,最高位代表符号位,取值范围为(-2)3 ~ 23-1,把取值范围中的-8~7分别用二进制表示出来。
十进制: 0 二进制: 0000 最高位: 0,表示正数
十进制: 1 二进制: 0001 最高位: 0,表示正数
十进制: 2 二进制: 0010 最高位: 0,表示正数
十进制: 3 二进制: 0011 最高位: 0,表示正数
十进制: 4 二进制: 0100 最高位: 0,表示正数
十进制: 5 二进制: 0101 最高位: 0,表示正数
十进制: 6 二进制: 0110 最高位: 0,表示正数
十进制: 7 二进制: 0111 最高位: 0,表示正数
十进制: -1 二进制: 1001 最高位: 1,表示负数
十进制: -2 二进制: 1010 最高位: 1,表示负数
十进制: -3 二进制: 1011 最高位: 1,表示负数
十进制: -4 二进制: 1100 最高位: 1,表示负数
十进制: -5 二进制: 1101 最高位: 1,表示负数
十进制: -6 二进制: 1110 最高位: 1,表示负数
十进制: -7 二进制: 1111 最高位: 1,表示负数
十进制: -8 二进制: 1000 最高位: 1,表示负数
假设int类型只有4位,从上面的二进制不难看出7+1=8,8不在-8~7的范围,会出现溢出的现象,所以在应用程序中7+1=-8,也就是最大值加1等于最小值,为什么是等于最小值呢?
这是因为在计算机中所有的数值都用二进制表示,7的二进制为01111,1的二进制为0001,同样最高位代表符号位,两个二进制相加的结果应该为1000,从上边的二进制编码中可以看出,1000代表十进制的-8,这就是java中int类型相加可能会溢出的原因。
同理,-8-1应该等于-9,可应用程序是取-8的二进制1000,取1的二进制0001,然后进行相减,1000-0001=0111,结果为7。
这里为了简单的说明只取了4位,同理可以拓展到32位(4个字节),也就是在程序中真正的int相加。
现在,在程序中运行,int的最大值加1,和int的最小值减1:
public class Test {
public static void main(String[] args) {
int max = Integer.MAX_VALUE;
int min = Integer.MIN_VALUE;
System.out.println("最大值: " + max);
System.out.println("最小值: " + min);
System.out.println("最大值加1的结果理应为最小值: " + (max + 1));
System.out.println("最小值减1的结果理应为最大值: " + (min - 1));
}
}
/*
运行的结果为:
最大值: 2147483647
最小值: -2147483648
最大值加一的结果理应为最小值: -2147483648
最小值减一的结果理应为最大值: 2147483647
*/
从而上面的分析得到了验证,如有错误,欢迎指正。