最近在刷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位而言,
最小的负数的二进制码是1000 0000 0000 0000 0000 0000 0000 0000 ,补码还是这个值,所以最小值为-231
最大正数是毫无疑问,所以还是0111 1111 1111 1111 1111 1111 1111 1111,也是231 – 1
最小值的二进制补码表示 1000 0000 0000 0000 0000 0000 0000 0000 ,减1后称为0111 1111 1111 1111 1111 1111 1111 1111是最大的正数
最大值的二进制补码表示 0111 1111 1111 1111 1111 1111 1111 1111,加1后称为 1000 0000 0000 0000 0000 0000 0000 0000
参考文献: java int型最大值/最小值,最大值+1,最小值-1 原码, 反码, 补码 详解
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/196057.html原文链接:https://javaforall.cn