美文网首页
Interger的最大值问题

Interger的最大值问题

作者: 会转圈儿的冷冷凉 | 来源:发表于2019-02-13 10:42 被阅读0次

    Integer.MAX_VALUE =2147483647

    此值是2的31次方-1 为什么使用这个值

    思路如下:

    cpu只认识高低电平 高电平记为1 低电平记为0 这很容易让我们对应到二进制,二进
    制又可以和十进
    制的数字进行转换
    因此也可以看成cpu认识的是一堆十进制的数字
    二进制和十进制的例子如下
    比如(首位为正负数标志位,0代表正数 1代表负数)
    00 -- 0
    01 -- 1 (2的1次方-1)
    010 -- 2
    011 -- 3 (2的2次方-1)
    0111 --7 (2的3次方-1)
    .
    .
    .
    011111..... --2147483647 (2的31次方-1)
    如上规律可以看出n位带符号二进制数能表示的最大的十进制值为:2的(n-1)次方-1
    为什么是2的(n-1)?,因为二进制首位是符号位
    为啥是2的(n-1)次方-1?看上面的结论即可
    这么多的数字在交流时不好量化,因此出现了承载这些数字(数据)的单位,也叫数据类型
    java语言中人们给二进制订制了很多单位来描述它的大小 从小到大依次记为bit -- byte -- short -- int --long

    规定:

    一个二进制位为 1位 记为1bit
    8bit(位)=1byte(字节)
    16bit =1short(短整型)
    32bit =1int(整型)
    64bit =1long(长整型)
    这里规定了32bit等于一个整型单位
    根据2的(n-1)次方-1这个公式,32bit 的取值范围为 -2147483648(-(2的31次方)) 到 2147483647(2的31次方-1)
    因此Integer.MAX_VALUE的最大值为2147483647。

    本来问题到这已经结束了,答案就是简单的规定而已,那么下面我们来想想人们为什么这么规定4字节代表int类型,或者直接把题目中Integer.MAX_VALUE换成为什么最大为4个字节

    所有的起源还得从cpu说起:
    我们都知道现阶段常用cpu都是32位和64位的,cpu的不同型号决定了cpu一次性读入数据的大小是多少
    比如32位cpu一次性可读取的数据大小是32位 也就是4个字节,64位cpu一次性可读取的数据大小是64位,也就是8字节
    将整数定义为4个字节可以让cpu一次性读的既不浪费 也不用分多次读入 效率较高(这里可以联想下socket编程中的缓冲区大小如何设置或者读取大文件时byte[]数组的大小设置)
    还可以适配64位的cpu 不用不同cpu写不同的代码

    下面我们看看为什么你问的是Int的范围而不是其他类型的范围

        各个数据类型的取值范围如下:
        byte的取值范围是-128到127(2的8次方-1) 占1个字节
        short的取值范围是-32768到32767(2的16次方-1) 占2个字节
        int的取值范围是-2147483648到2147483647(2的32次方-1) 占4个字节
        long的取值范围是-9223372036854774808到9223372036854774807(2的32次方-1) 占8个字节
    

    前两者太小,最后者又过大,刚好int可以概括现在用的大多数场景,因此大多数提问问的是int的长度~

    后续:

    数字对人的识别度太低了,人们更愿意认识abc来代替一串二进制数或者十进制数,比如你可以自创的把0111 --对应'吃饭' 把0000 0001 --对应'a',
    假如你这套东西用的人多了,
    这个订制就是一个标准
    因此那个时代计算机界大佬们创造了ascii码
    49(00110001)来表示字符1
    用97(01100001)来表示字母a
    ascii码是给人看的,放到cpu中 仍然是一堆数字,可以debug下java代码 看看一个字符串在内存中的含义

    相关文章

      网友评论

          本文标题:Interger的最大值问题

          本文链接:https://www.haomeiwen.com/subject/pxureqtx.html