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

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

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值