课程【4】

Java数据存储

java语言中有八大数据结构,整形:int、short、long、byte,浮点型:float、double,字符型:char,布尔型:boolean。
引用数据类型:类、接口、数组。

在数据结构中,数组查找方便,但是删除比较不方便,相反,链表在内存中不连续,方便删除但是不方便查询。

各数据类型存储范围: 字节长度
short 2字节长度
int 4字节长度
long 8字节长度
byte 1字节长度
float 4字节长度
double 8字节长度

java是强类型语言,本质上就是Java在内存中开辟不同类型的内存空间。

在计算机中,只有加法没有减法,在做减法运算时可以认为是加上一个负数,这样可以减少计算机电路的复杂程度。但是使用原码运算会出现问题,与实际结果不符,这时需要用补码进行运算,(正数的原码=反码=补码,负数的反码=原码的符号位不变,其他位按位取反,补码=反码+1)。反码是为了解决减法运算,补码是为了解决反码产生的+0、-0的问题。

浮点类型的精度丢失问题

1.浮点类型在计算机中的存储
float存储需求是4字节(32位),其中1位最高位是符号位,中间8位是阶位,后32位表示数值大小。
double存储需求是8自己(64位),其中1位最高位是符号位,中间11位表示阶位,后52位表示数值大小。
double表示这种类型的数值精度是float类型的两倍,绝大部分应用都采用double类型。
在这里插入图片描述

2.浮点类型的精度丢失
由float类型能直接转换位double类型,但是由double类型转换为float类型时会导致精度丢失,精度丢失就是位数不够表示整个数值。

public class SimpleTest {
    
    
    public static void main(String[] args) {
    
    
    	System.out.println(1.2 - 1);
    }
}

输出:0.19999999999999996

这和我们预期的情况完全不符
接下来将10进制的0.2转化为2进制进行存储

 算法是乘以2直到没有了小数为止
                       0.2 * 2 = 0.4            取整数部分 0
                       0.4 * 2 = 0.8            取整数部分 0
                       0.8 * 2 = 1.6            取整数部分 1
                       0.6 * 2 = 1.2            取整数部分 1
                       0.2 * 2 = 0.4            取整数部分 0
                       .......

0.2的2进制从上到下可以表示为 00110011…
注意:上面的计算过程循环了,也就是说2永远不可能消灭小数部分,这样算法将无限下去。很显然,小数的二进制表示有时是不可能精确的 。其实道理很简单,十进制系统中能不能准确表示出1/3呢?同样二进制系统也无法准确表示1/10。这也就解释了为什么浮点型减法出现了"减不尽"的精度丢失问题。*

数值类型自动转换图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/LB_Wuyanzu/article/details/121718562