java中的Integer.MAX_VALUE和Integer.MIN_VALUE
最近在刷leetcode的题时,才发现有几道题的利用到Integer类型的最大值和最小值,尤其是在判断是否溢出的时候,有道题就非常经典直接判断最后一位,比如最大值231 - 1的最后一位是7,而最小值 -231 的最后一位是8,这样进行一个判断
8. 字符串转换整数 (atoi) 这道题对我在面试过程中被问到如何判断是否溢出有了很大启发
查下JDK1.6帮助文档是这样写的
在这里直接能看到这个数值,突然一看对于最大值还是能理解的,但是对于最小值就不是很理解了。
一般能在网上看到这段话
四字节的整形 有符号是 -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