整数运算中不会出错的溢出

  1. Demo
  2. Analysis

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

他の者にできたか?ここまでやれたか?この先できるか?いいや、仆にしかできない!

目录
×

喜欢就点赞,疼爱就打赏