敞开生长之旅!这是我参与「日新计划 12 月更文应战」的第25天,点击查看活动概况
开篇
本文主要介绍在Java中,为什么int类型的最大值为2147483647。
理论值
咱们都知道在Java中,int 的长度为32位。
理论上,用二进制表明,32位每一位都是1的话,那么这个数是多少呢?
咱们来核算一下,第0位能够用20^0表明,第1位能够用21^1表明,第31位能够用231表明,那么32位二进制能够表明的最大值为232 – 1,所以理论上32位数值的取值规模为0 ~ 232 – 1。
那么,Java的int最大值真的为232 – 1吗?
咱们知道,232 – 1这个值为42亿多。而在Java中,int的最大值为2147483647也便是21亿多,为什么有这个差距呢?
剖析
咱们来看下,Java中int的最大值以及这个最大值的二进制数据。
能够看到,int的最大值的最高位为0,而不是1,也便是用31位来表明能够取到的最大值,而不是32位。
由于在Java中,整型是有符号整型,最高位是有特殊意义,代表符号,真实表明数据值的规模为0 ~ 30位。
所以,按照31位来表明的话,其最大值为231 – 1,而这个值便是2147483647即21亿多。
int数据有正负之分,所以最高位用来表明符号,0代表正数,1代表负数。因而Java中,int的数据规模为 -231 ~ 231 – 1。
为啥减1
那为什么都是231, 正数的时候需求减1呢?
咱们先来看一下,int的最大值和最小值:
不看符号位的话,最大值比最小值少了1个,这是由于0归到正数里边,所以占用了正数的一个方位。
拓展
负数表明
负数的二进制方式如何表明呢?
先看-100这个数的二进制方式:
最高位为1,就代表负数。值就为符号位后面的值取反再加上1。
二进制1100100对应的10进制便是100.
反码
反码便是,对一个数的二进制除符号位外,按位取反。取反便是二进制数,1变成0,0变成1,这个进程便是取反。
来看一个比如:
能够看到,a、b两个数的二进制是完全相反的。
为什么要取反加1呢?为什么要规划的这么歪曲?到底是人性的歪曲仍是道德的沦丧? 这样规划有什么好处?
在核算机系统里,加减乘除的运算,并不是咱们幻想中10进制的加减乘除,他最后都会被翻译成2进制的位运算来核算。
假如有2个数,a、b都是整数,那么a + b 对应的二进制便是简单的相加。那么假如a为负数,b为正数呢?在履行a + b 的时候,难道还需求特殊处理一下吗?显然是不可能的,在二进制运算中,加减乘除运算只有各自的一套逻辑,无论符号两头的数是什么姿态的。
a为负数,那么对a进行取反加1,再与b进行相加,能够按正常的相加逻辑,这样运算成果依然是正确的,而不是说,当a为负数时,核算机去履行另一套的相加逻辑。规划成取反加1,能够让相加运算不去关注两头的数据是正是负,只履行一套相加逻辑就能够了,这对核算机来说是一个功能的提高。
示例
从上面咱们得知,负数的二进制表明为数值部分取反加1,以-100为例,那么能够得出-100 等于 ~100 + 1。
知道负数的二进制的姿态后,再看int最小值和-1的二进制数据,就不会惊奇了。要不然,当看到int的最小值的二进制竟然是一堆0组成,而-1竟然是一堆1,看到这样的数据,心里岂不是冒出一堆问号或许一群羊羔飘过。
取反加1仍是自己的数
有没有一个数,取反加1仍是自己?有,0和int的最小值,下面来看下:
先看下Integer.MIN_VALUE的取反加1的进程,能够看到,Integer.MIN_VALUE在取反后加上1,仍然仍是他自己。
再看下0的取反加1进程,能够看到0再取反加1后,我嘞个去,竟然溢出了!溢出怎么办?溢出就扔了吧不要了,成果仍是他自己。
跋文
本文主要介绍在Java中,为什么int类型的最大值为什么是21亿多,以及涉及到的知识点的拓展,如有错误欢迎之处。











