主要的原因是因为浮点类型和整数类型的存储结构不相同,整数类型在计算机底层采用补码方式存储,除去首位的符号位,剩余的位数即表示数值的范围,也就是位数越多,范围越大,比如long在内存中占用8个字节共64位,符号位占一位,数值范围是-2^63到正2^63-1。
整数数据类型
·
数据类型 | 字节 | 范围 |
byte | 1 | -128~127 |
short | 2 | -2^15~2^15-1 |
int | 4 | -2^31~2^31-1 |
long | 8 | -2^63~2^63-1 |
一个字节8位(2^7-1)从0到127
转化为二进制:0111 1111
最小位-128(-2^7)
转换位二进制1111 1111
第一位是符号位,0代表正数.1代表负数
当字节位2,4,8时同理。
浮点型数据类型
那么对于单精度浮点数float是采用这样的结构存储的,4个字节的浮点数。当然了double的结构也是这样,只不过double是8个字节(32位)的,下面依次介绍符号位、指数域和小数域的用处。
一旦浮点数的位数确定以后合理分配阶码和尾数的尾数
阶码越长,表示范围越大
尾数越长,表示精度越高
float 4个字节32位:
1位符号位 8位指数位 23位尾数位,所表示的数值范围为:-3.403E38到3.403E38
float 8个字节64位:
1位符号位 11位指数位 52位尾数位,所表示的数值范围为:2^-128到2^127
符号位:用来存储正负符号的,0表示正数,1表示负数
指数域:确定数的范围
小数域:确定小数的精度
浮点数的表示按照这个公式计算而来
V=(-1)^符号位 * 小数域 * 2^指数域
八字节long范围-2^63~2^63-1,四字节的float位2^-128~2^127
这样计算出的浮点数能够表示的范围会比长整型long表示范围大,且占用空间更小。