java之数据溢出

来源:互联网 发布:无线通信与网络 编辑:程序博客网 时间:2024/05/31 06:23

转载请注明出处

 

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 valueSystem.out.println("big = " + big);int bigger = big * 4;System.out.println("bigger = " + bigger);}}


 

运行的结果是:

big = 2147483647bigger = -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 = 2147483647reallyBigger = 8589934588



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

 

1 0
原创粉丝点击