(java)基本数据类型范围详解

    技术2023-06-19  105

    (Java)基本数据类型范围详解

    个人感觉基础很重要,之前也在笔记本上做了相关的笔记,但是还是容易忘掉原理,每次还得花点时间想一下,这次就详细的解释一下,方便自己以后复习以及查看

    Java的基本数据类型可以分为四个大类,整数型,浮点型,字符型,布尔型

    整数型(从小到大):byte,short,int,long

    浮点型(从小到大):float,double

    字符型:char

    布尔型:boolean

    整数型

    byte

    数值范围为一个字节

    -128~127

    原理:一个字节有八位,除去第一个为符号位,所以为27,至于正数为什么要减一,是因为27的含义是有2^7种可能,映射到数值上就是1~128,但是正数是从0开始,故减一,同理,负数不包括零,故不用减一

    short

    数值范围为两个字节

    原理同上,后不再叙述

    int

    数值范围为四个字节

    long

    数值范围为八个字节

    浮点型

    float

    占四个字节,为什么不说数值范围为四个字节呢?因为浮点型采用的是科学计数法

    float为单精度浮点型

    1bit表示符号,8bit表示指数,23bit表示小数

    (转载作者:Boss呱呱 链接:https://www.zhihu.com/question/46432979/answer/221485161 来源: 知乎)

    需要注意的是指数可能是负数,也有可能是正数,即指数是有符号整数,而有符号整数的计算是比无符号整数麻烦的。所以为了减少不必要的麻烦,在实际存储指数的时候,需要把指数转换成无符号整数。那么怎么转换呢?

    注意到float的指数部分是8位,IEEE规定这个指数的取值范围是 -126到+127(详见下文),为了消除负数带来的实际计算上的影响(比如比较大小,加减法等),可以在实际存储的时候,给指数做一个简单的映射,加上一个偏移量,比如float的指数偏移量为127,这样就不会有负数出现了。

    比如

    指数如果是6,则实际存储的是6+127=133,即把133转换为二进制之后再存储。

    指数如果是-3,则实际存储的是-3+127=124,即把124转换为二进制之后再存储。

    当我们需要计算实际代表的十进制数的时候,再把指数减去偏移量即可。

    float的精度为2^24=16777216,也就是说float最大的精度为8位,但是完全可以表示的精度是7位,至于为什么是24次方,不是float只有23个小数位嘛?

    这就涉及到隐含以一开头了

    (转载于 https://blog.csdn.net/liu_jiachen/article/details/100138857)

    double

    double为双精度浮点数,占8个字节

    1bit符号位,11bit指数位,52bit指数位

    原理同float

    double的精度最大能表示17位,但是能完全表示16位

    说到这里我们就发现,float的四字节能表示的数值范围超过了long八字节表示的范围,由此我们可以得出结论,数值范围和字节数不一定相关

    字符型

    char

    char占两个字节

    嗯,这个没有什么说的。。。

    布尔型

    boolean

    boolean占一个字节。。。

    Processed: 0.015, SQL: 9