为什么最大值加一等于最小值

在程序中有时候不小心将最大数值加1,我们会得到一个负数,这个负数就是这种数据类型的最小值。

下面看一个示例:

public class Number {
	public static void main(String[] args) {
		System.out.println("最大的整数:" + Integer.MAX_VALUE);
		System.out.println("最大的整数(二进制):" + Integer.toBinaryString(Integer.MAX_VALUE));
		System.out.println("最小的整数:" + Integer.MIN_VALUE);
		System.out.println("最小的整数(二进制):" + Integer.toBinaryString(Integer.MIN_VALUE));
		System.out.println();
		long num1 = Integer.MAX_VALUE + 1;
		System.out.println("最大的数" + Integer.MAX_VALUE + "加一等于" + num1);
		long num2 = 2147483647L + 1;
		System.out.println("在运算过程中强制类型转换");
		System.out.println("最大的数" + Integer.MAX_VALUE + "加一等于" + num2);
	}
}

运行结果:

最大的整数:2147483647
最大的整数(二进制):1111111111111111111111111111111
最小的整数:-2147483648
最小的整数(二进制):10000000000000000000000000000000

最大的数2147483647加一等于-2147483648
在运算过程中强制类型转换
最大的数2147483647加一等于2147483648

从结果可以看出:最大的整数加一确实变成了最小的整数,从它们的二进制形式更可以明显的看出。计算机内部进行计算的时候是以二进制的补码形式进行加法运算的。很显然,最大的数01111111111111111111111111111111+1=10000000000000000000000000000000,这里的10000000000000000000000000000000是-2147483648的补码形式。

如果在运算过程中我们强者将数据类型转换成存储容量更大的数据类型,则不会出现这一变成负数这样的结果。2147483647L + 1是long型的2147483647+1这样就不会溢出变成负数。


此外,还需要注意的是在Java和C#中int是32位,long是64位,我们这样转换没有问题。但是在C++语言中short、int和long的位数和操作系统有关。我们只能说short<=int<=long,当然两个等号不会同时成立。所以有时候我们会看到long long这样的写法,long long是比long类型容量更大的整形。在VC++中long long也写作_int64。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值