对java中int类型的基本数据类型的理解和溢出的本质

本文深入浅出地解析了Java中int类型的基本数据类型及其溢出的本质,通过简化int类型为4位的例子,详细解释了正负数在二进制中的表示方式,以及加减运算时出现溢出的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对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
*/

从而上面的分析得到了验证,如有错误,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值