0
点赞
收藏
分享

微信扫一扫

Java小白踩坑录 - 数据运算时溢出要注意


Java小白踩坑录 - 数据运算时溢出要注意_十进制

public static void main(String[] args){ 
int x = -2000000000;
int z = 2000000000;
System.out.println(x - z);
}

小白用肉眼看了一下,这个结果应该为负数,不该为正数呀,运行程序,结果显示为:294967296。


寻求解决

很明显,x 比 z 小,它的结果为一个负数,但是程序打印的是 294967296,它是一个正数。突然想到是不是两个数的差超过了 int 最大最小值的范围,然后溢出了?那就验证一下吧 !

/**
* A constant holding the maximum value an {@code int} can
* have, 2<sup>31</sup>-1.
*/
@Native public static final int MAX_VALUE = 0x7fffffff;

int 的最大值为 2,147,483,647,最小值为 -2,147,483,648,故 -2,000,000,000–2,000,000,000 的值为 -4,000,000,000 小于最小值 -2,147,483,648,产生了溢出,溢出的值又如何得到的呢?

public static void main(String[] args){
int x = -2000000000;
int z = 2000000000;
int max=Integer.MAX_VALUE;
System.out.println(Integer.toHexString(x));
System.out.println(Integer.toHexString(z));
System.out.println(Integer.toHexString(x-z));
}

-2,000,000,000 的 16 进制数值为:0x88ca6c00。

2,000,000,000 的 16 进制数值为:0x77359400。

两个数值相减的 16 进制数值为:0x1194d800 (十进制数值294967296)


总结

不止 int 会碰到这种问题,byte、char、long 等都会碰到溢出,故了解它们的范围很有必要:

• byte : 从 -128 到 127(包含);

• short : 从 -32768 到 32767(包含);

• int : 从 -2147483648 到 2147483647(包含);

• long : 从 -9223372036854775808 到 9223372036854775807(包含);

• char : 从 ‘\u0000’ 到 ‘\uffff’ 包含,即从 0 到 65535。


举报

相关推荐

0 条评论