目录
问题现象:
最近在复习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知识掌握程度的要求基本都很低,所以就随手问几个基础问题)。
总之,这种问题并不能看得出一个人的开发能力如何,所以如果有相似面试经历的小伙伴,完全不需要太在意这种事情。最重要是个人能力的提升,我之前不知道,但现在知道了,这就是一种进步,而且就这丁点知识,都不怎么需要硬记,理解即可。