基本数据类型的精度和范围
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位。
原文地址: https://blog.csdn.net/qq_40393000/article/details/82748711
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章