基本数据类型的精度和范围

Java中的数据类型分为:基本数据类型和引用数据类型。如下图所示:

下面主要要讨论的是基本数据类型的数据表示范围是如何得到的。

1.首先应该对计算机的存储单元有一定的了解。

在计算机里无论是内存还是硬盘,计算机存储设备的最小信息单元叫“位(bit)”,我们又称其为“比特位”,通常用小写字母b表示。

而计算机最小的存储单元叫“字节(byte)”,通常用大写字母B表示,字母是由连续的8个位组成。

1 B (字节)= 8 bit(位)。

2.了解了字节与比特位的关系之后,我们再来讨论byte的取值范围 。

A.理解为什么是-128~127共256个值

byte 由1个字节组成,即是由8个位组成的。其中最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

8位二进制可以表示256个值。正负平均分的话可以各128个,这里把0看做正数。

所以正数为:0-127 共128个值,负数为: -1  ~ - 128  共 128个值。

B.再看看这些值在计算机中是如何表示的

首先应该知道的是符号数在计算机中都是以补码的形式存储的。

正数为 0~127  即 0000 0000    ~    0111 1111。  (正数的补码等于其原码)

负数为 -1 ~-128 即 1111 1111  ~10000000 。 (负数的补码表示,其补码等于其绝对值的原码按位取反后加一得到)

-1 的绝对值为 1, 1的表示方法为0000 0001  将它按位取反后得: 1111 1110  再加1得: 1111 1111 。

-128 的绝对值为 128, 128 的表示方法为1000 000  将它按位取反后得:0111 1111 再加1 得 :1000 0000 。

这里的最高位为符号位即0000 0000 和 1000 0000 分别表示 +0 和 -0 。而0只需要一个表示就可以了,为了充分利用空间这里把+0保留最为0。 而 -0 把它表示为负数。

(这里是关键,也就是说-0的补码用来表示-128了,而-0的补码"10000000"通过逆向计算刚好得到-128这个值)。

short 、int、long的取值范围同理可得其取值范围。

整数类型 字节数  取值范围
字节型(byte) 1 -2^7    ~    2^7-1
短整型(short) 2 -2^15   ~     2^15 -1
整形(int) 4 -2^31   ~     2^31-1
长整型(long) 8 -2^63   ~   2 ^63-1

(注意:表示长整型时,在数字后面加L或l,eg:125L)。

3.最后讨论float和double类型的取值范围和精度。

A.float和double类型的取值范围

float 和 double 在计算机中分别占 4 个字节 和 8 个字节。

float共32位的分布为 :1bit(符号位) + 8bits(指数位)+ 23bits(尾数位)

double共64位的分布为:1bit(符号位)+ 11bits(指数位)+ 52bits(尾数位)

在数学中,特别是在计算机相关的数字(浮点数)问题的表述中,有一个基本表达法:
value of floating-point = significand x base ^ exponent , with sign 
译为中文表达即为:(浮点)数值 =      尾数    ×    底数 ^ 指数,(附加正负号)

可知float和double的范围是由指数的位数来决定的。

其指数位是由补码的形式来表示的。

float 的指数位为8位,于是float的指数范围为:-127~128      

double的指数位为11位,于是double的指数范围为:-1023~1024

(这里float的指数位8位的取值范围按补码表示应该为-127~127,多余一个补码为1000 000 ,在byte字节的取值中 1000 0000 表示 -128,在float中表示+128)

其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。

所以float的范围为 -2 ^128 ~  2^128,即约为:-3.40E38 ~ +3.40E38;

double的范围为-2^1024 ~ +2^1024,即约为:-1.79E308 ~ +1.79E308。

B.float和double类型的精度

float和double的精度是由尾数的位数决定的。

浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。

(8.25用十进制的科学计数法表示为:8.25*10E0,用二进制表示可表示为1000.01,用二进制科学计数法表示为:1.0001*2E3

 120.5用十进制的科学计数法表示为:1.205*10E2,用二进制表示为:1110110.1,用二进制科学计数法表示为:2.1101101*2E6

可见任何一个数都的科学计数法表示都为1.xxx*2En, 尾数部分就表示为xxxx)

float:2^23 = 8388608,共七位,意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

猜你喜欢

转载自blog.csdn.net/qq_40393000/article/details/82748711