在程序中有时候不小心将最大数值加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。