java之数据溢出

转载请注明出处

 

http://blog.csdn.net/pony_maggie/article/details/43907797

 

作者:小马

 

java是一门相对安全的语言,那么数据溢出时它是如何处理的呢? 看一段代码,

public class Overflow 
{

	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{

		int big = 0x7fffffff; //max int value
		System.out.println("big = " + big);
		int bigger = big * 4;
		System.out.println("bigger = " + bigger);
				
	}

}


 

运行的结果是:

big = 2147483647
bigger = -4



int类型在java中是四字节,且分正负,所以最大的int型数值是0x7fffffff。变量bigger显然是溢出了,但是你并没有得到编译错误,或者运行时错误。看起来不错,但是有时候并不一定是好事情,就像这个示例,我们期望的结果应该不是-4,而且程序也没有错误提示。

 

那么如何解决溢出的问题呢? 很容易想到的一个方案是用更大的数据类型,long型占8个字节,可以用,

public class Overflow 
{

	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		
		long reallyBig = 0x7fffffffL;
		System.out.println("reallyBig = " + reallyBig);
		long reallyBigger = reallyBig * 4;
		System.out.println("reallyBigger = " + reallyBigger);
		
	}

}



输出,

reallyBig = 2147483647
reallyBigger = 8589934588



继续思考一个问题,第一个示例溢出的结果为什么是-4? 可以从第二个示例的结果得到一些启示,8589934588的十六进制是1FFFFFFFC,只留四个字节(int型只占四字节)是FFFFFFFC,这是补码,并且因为是最高位是1,所以还是个负数。转成原码(除符号位外,取反加1)变为10000004,也就是-4。

 

你可能感兴趣的:(java,int,long,溢出)