对于整型最大值(Integer.MAX_VALUE)溢出变为最小值(Integer.MIN_VALUE)的问题本篇博客主要介绍一下其中的原因。
我们先来复习一下整型:
- 整型所占4个字节
- 它的取值范围是 -2^31 (Integer.MIN_VALUE)-> 2^31-1 (Integer.MAX_VALUE)
- Java中一个int变量占4个字节,和操作系统没用关系(跨平台)。
查看Java中整形数据的范围:
System.out.println(Integer.MAX_VALUE);//int的最大值
System.out.println(Integer.MIN_VALUE);//int的最小值
对于Java中其他数据类型的介绍见博客:链接: java变量知识点总结.
对于整型超过最大值(溢出),就会转向负的最小值,我们来详细说说。
- 首先,整型的最小值( Integer.MIN_VALUE= -2^31)它是一个负数,并且占四个字节;
- 所以 -2^31的补码形式就是1000 0000 0000 0000 0000 0000 0000 0000(31个0);
- 对-2^31取反:最高位符号位变为0,其他位按位取反,最后在+1;
- 如上图所示,又变回了 Integer.MIN_VALUE( -2^31)
总结:
对-2^31 取反是 2^31 (即Integer.MAX_VALUE+1),但是在整型4个字节中,最大值是(2^31-1),所以在整型变量的设计中就将超过正数最大值(溢出)转向了负数最小值,整个流程就相当于一个环(见最上面图所示)!