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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值