整数运算中不会出错的溢出
Demo
整数由于存在范围限制,如果计算结果超出了范围,就会产生溢出。
要特别注意的是,整数运算导致的溢出并不会出错。也就是运算不会报错而中止,而是继续运算,只是得到的不是我们想要的结果,这是由于整数运算的二进制运算规则导致。
public static void main(String[] args) {
int x = 2147483640;
int y = 15;
int sum = x + y;
System.out.println(sum); // -2147483641
}
Analysis
对于整数类型,表示的范围大小用二进制,最高位的bit表示符号位(0表示正数,1表示负数)。
所以1 byte(等于8bit) 表示的范围是 -128~127(-2^7 ~ 2^7-1)
要解释上述结果,我们把整数2147483640和15换成二进制做加法(计算机只有加法器,减法会转为加上一个负数,然后还是二进制做加法):
0111 1111 1111 1111 1111 1111 1000
+ 0000 0000 0000 0000 0000 0000 1111
------------------------------------
1000 0000 0000 0000 0000 0000 0111
由于计算结果最高位为1,因此,加法结果变成了一个负数。
要解决上面的问题,可以把int换成long类型,由于long可表示的整型范围更大,所以结果就不会溢出。
long x = 2147483640;
long y = 15;
long sum = x + y;
System.out.println(sum); // 2147483655
他の者にできたか?ここまでやれたか?この先できるか?いいや、仆にしかできない!