java中的Integer.MAX_VALUE和Integer.MIN_VALUE

最近在刷leetcode的题时,才发现有几道题的利用到Integer类型的最大值和最小值,尤其是在判断是否溢出的时候,有道题就非常经典直接判断最后一位,比如最大值231 - 1的最后一位是7,而最小值 -231 的最后一位是8,这样进行一个判断

8. 字符串转换整数 (atoi) 这道题对我在面试过程中被问到如何判断是否溢出有了很大启发

查下JDK1.6帮助文档是这样写的

Javaint类型最大数 java int最大值和integer_Javaint类型最大数


在这里直接能看到这个数值,突然一看对于最大值还是能理解的,但是对于最小值就不是很理解了。

一般能在网上看到这段话

四字节的整形 有符号是 -231~231-1 ;在计算机内部数值的二进制表示,有正码、反码和补码。一般采用二进制补码进行表示和运算,MIN_VALUE = 0x80000000 和 MAX_VALUE = 0x7fffffff 就是补码表示的Integer的最小值(-231)和最大值(231-1)。至于Integer的最大值最小值为什么是这两个数,这是因为Java语言规范规定int型为4字节,不管是32/64位机器,这就是其所宣称的跨平台的基础部分.

那么在计算机中其实是用做补码进行表示和运算的,使用补码不仅仅修复了0符号以及存在两个编码的问题,而且还能够多表示一个最低数,这也就是8位二进制数表示的范围为[-127,+127],而使用补码表示的范围为[-128,127]
例如有:

(-1)+ (-127) = [1000 0001] + [1111 1111] = [1111 1111] + [1000 0001] = [1000 0000]

-1-127的结果应该是-128,在用补码运算的结果中,[1000 0000] 就是-128,但是注意因为实际上是使用以前的-0补码来表示-128,所以-128并没有原码和反码表示。(对-128的补码表示[1000 0000] 补算出来的原码是[0000 0000],这是不正确的)

那么类似的对于32位而言,

int类型能表示的最小负数

最小的负数的二进制码是1000 0000 0000 0000 0000 0000 0000 0000 ,补码还是这个值,所以最小值为-231

int类型能表示的最大正数

最大正数是毫无疑问,所以还是0111 1111 1111 1111 1111 1111 1111 1111,也是231 - 1

重要的性质最小值-1

最小值的二进制补码表示 1000 0000 0000 0000 0000 0000 0000 0000 ,减1后称为0111 1111 1111 1111 1111 1111 1111 1111是最大的正数

重要的性质最大值+1

最大值的二进制补码表示 0111 1111 1111 1111 1111 1111 1111 1111,加1后称为 1000 0000 0000 0000 0000 0000 0000 0000

参考文献:
java int型最大值/最小值,最大值+1,最小值-1