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知识掌握程度的要求基本都很低,所以就随手问几个基础问题)。

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

猜你喜欢

转载自blog.csdn.net/weixin_42585386/article/details/127639294