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

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

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

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

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

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

字符型:char

布尔型:boolean

整数型

byte

数值范围为一个字节

-128~127

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

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

short

数值范围为两个字节

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

原理同上,后不再叙述

int

数值范围为四个字节

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

long

数值范围为八个字节

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

浮点型

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转换为二进制之后再存储。

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

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

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

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

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

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

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

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

double

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

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

原理同float

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

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

字符型

char

char占两个字节

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

布尔型

boolean

boolean占一个字节。。。