• java的8种基本数据类型-附取值范围的计算逻辑


    目录

    问题现象:

    问题分析:

    拓展:


    问题现象:

            最近在复习java的时候,发现了一些很小的基础知识点:

            java的8种基本数据类型-附取值范围的计算逻辑!


    问题分析:

            本来是不想写文章的!!!但听说有些师弟居然被面试官问到了关于“占用空间”的问题,但却答不上来,所以特此记录一下,希望对刚踏入社会的小伙伴们有所帮助。

            下面我按自己认为比较容易记忆的顺序罗列一下今天的知识点:

    JAVA的8种基本数据类型和占用空间大小:

    基本类型描述取值范围空间大小(1字节=8bit
    byte字节型[-2^7,2^7-1]=[-128,127]1个字节
    char

    字符型。

    Java字符采用Unicode编码

    [\u0000,\uFFFF]=2^16=65536个字符2个字节
    short短整型[-2^15,2^15-1]=[-32768,32767]2个字节
    int整型[-2^31,2^31-1]=[-2147483648,2147483647]4个字节
    long长整型

    [-2^63,2^63-1]=

    [-9223372036854774808,9223372036854774807]

    8个字节
    float

    单精度浮点型

    精度为7-8位

    [-3.40E+38,3.40E+38]=[-3.40*10^38,3.40*10^38]4个字节
    double

    双精度浮点型

    精度为15~16位

    [-1.79E+308,1.79E+308]=[-1.79*10^308,1.79*10^308]8个字节
    boolean

    布尔型

    数据值只有true或false

    不固定字节

    【要取决于虚拟机机制,但不管怎么样实际上有效的只有1个bit(1或0)。而cpu数据处理是以字节为最小单位

            在jvm规范中确定了boolean数组会被编译为byte类型数组,所以是占1字节

            同时java建议boolean可以被编译为int类型,所以是占4个字节。】

            既然写了这篇文章,那也希望大家知其然,更要知其所以然!!!

            这里给大家举例说一下表格里的取值范围是怎么算出来的,例如byte类型

    byte字节型[-2^7,2^7-1]=[-128,127]1个字节

            1、byte类型占1个字节1字节=8bit,而计算机底层是二进制(0和1)的,因此可以得知能表示byte的数据区间就是[00000000,11111111],即[0,2^8-1],由此可知该区间含有2^8-1=255个数正数,还有一个0,所以一共是256个数。

            2.1、然后再考虑正数、负数和0的情况。所以就需要将255个正数分一半到负数去,然后由于255是奇数,总有一方会多一个,最后就是给负数分多了一个,所以最后是[-128,127]!

            当然了,这时候肯定会有人提出疑问:为什么多的一个要给负数呢?为什么不给正数?

            我要是说:就喜欢给负数,估计也说服不了你。那么实际原因是什么呢?

            其实是由底层的二进制表示数决定的!!!

            2.2、大学学过计算机科学导论的朋友应该都知道,表示正负数的规则就是利用:最高位(bit)的0(正)和1(负)来表示正负号

            因此需要牺牲一个最高位用来表示正负号,此时byte的数据区间就是这样的:

            负数:[11111111,10000001]=[-2^7,-1]=[-127,-1]

            0:[00000000]=[0]

            正数:[00000001,01111111]=[1,2^7-1]

            此时细心的朋友会发现,还有一个二进制数据我还没有提到那就是:

            [10000000]

            那么这个二进制数据要如何定义它的十进制的值呢?假如最高位数是用来表示正负号,那按理说这个数据应该表示的是-0才对!!!如果按照这个说法那[00000000]就表示+0

            按逻辑来说确实如此,然而计算机中却不是如此,早期的计算机是很庞大的,很耗性能,也很耗硬件资源,因此为了让有限资源的利用率最大化,舍弃了[10000000]表示-0的想法,也可以简单的理解为:

            -0或+0都表示0是没必要的,其一0没有正负号,其二同一个数字不需要用两种二进制表示数,浪费资源。

            那么,在不打破最高位为1时,表示负数的规则,[10000000]应该表示什么数呢?

            通过观察可以发现,如果把1个字节变成2个字节的话,即前面再填8个0的话:

            [11111111]=[0000000011111111],

            此时使用最高位的1表示负数的话,就会变成:[-127]=[10000000 01111111];

            然后再-1的话【即(-127)+(-1)= -128】;由于最高位表示负数,而负数+负数还是负数,所以计算结果的最高位还是1,所以:

            [10000000 01111111]+[10000000 00000001]=[10000000 10000000],此时就会发现后面那8个bit:[1000000],刚好就是我们要表示的数字,于是:

            [1000000]就被用来表示-128了.

            同理可验其他的例子。然后再提一句:在java中,除了以上8种基本数据类型之外的都属于引用类型!


    拓展:

            个人觉得基本数据类型有哪些(8种)才是重点!!!毕竟这在开发工作中必然会用到。

            但“占用空间大小”这个我觉得可以了解,但应该没必要作为面试题来问吧?

            如果因为这种问题而留下坏印象的话,我只能说要不就是面试官想刁难你了(运气不好哦);要不就是想看你的八股文背的怎么样了(一般这种基础只有实习期才可能会问,实习期的话对java知识掌握程度的要求基本都很低,所以就随手问几个基础问题)。

            总之,这种问题并不能看得出一个人的开发能力如何,所以如果有相似面试经历的小伙伴,完全不需要太在意这种事情。最重要是个人能力的提升,我之前不知道,但现在知道了,这就是一种进步,而且就这丁点知识,都不怎么需要硬记,理解即可。

  • 相关阅读:
    毕业设计 基于大数据的股票量化分析与股价预测系统
    Scikit-Learn快速生成分类数据集
    springboot服务和python服务如何自定义启动banner
    maui 开发AMD CPU踩的坑。
    熬夜也要肝完的阿里内部面试官手册,吃透直接拿下大厂心仪 offer
    DIVFusion_ Darkness-free infrared and visible image fusion 论文解读
    python教程:列表[list]和元组(tuple)
    LeetCode 852. 山脉数组的峰顶索引
    【电路笔记】-快速了解无源器件
    Vue组件框架(ElementUI+Axios+Vuex)
  • 原文地址:https://blog.csdn.net/weixin_42585386/article/details/127639294