本文共 1302 字,大约阅读时间需要 4 分钟。
四种整型:byte,short,int,long 两种浮点类型:float,double 一种字符型:char 布尔类型:boolean
原码: 将一个数值采用二进制的方式表示,得到的就是原码。最高位为符号位,1表示负数,2表示整数。反码: 因为计算机只有加法,没有减法,在做减法运算的时候,可以认为是加上一个负数,这样可以减少计算机电路的复杂度。使用原码进行减法运算会出现问题,为了解决减法的问题,计算机引入了反码。 正数的反码与原码相同;负数的反码是由原码除符号位外,其它位取反,即“0”变成“1”,“1”变成"0"补码: 为了解决减法产生的正负零的问题,计算机引入了补码。 正数的补码与原码相同;负数的补码是由原码除符号为外,其他位取反,加一变换而成,即反码+1
byte类型的表示数值范围是:-128-127,最高位是符号位,那么怎么能表示-128呢? 采用数轴的方式表示: 原码 补码 -1 1000 0001 , 1111 1111 -2 1000 0010 , 1111 1110 -3 1000 0011 , 1111 1101 .。。。。 可以看出-2的补码等于-1的补码-1,-3的补码等于-2的补码-1,依次递推,1000 0000是-128的补码,因此,byte的数值范围是-128-127。
浮点类型在计算机当中的存储
float存储需求是4字节(32位), 其中1位最高位是符号位,中间8位表示阶位,后32位表示值 double存储需求是8字节(64为),其中1位最高位是符号位,中间8位表示阶位,后52位表示值浮点类型精度的丢失
一个精度丢失的例子:public class SimpleTest { public static void main(String[] args) { System.out.println(1.2 - 1); }}0.19999999999999996
结果明显出问题了。
将十进制的0.2转化为2进制存储为:0.0011001100110011…是一个无限循环,因此,必定在二进制转化为十进制的过程时会产生误差,必定会有精度丢失。解决精度丢失问题
JAVA中有一个类,专门解决精度`丢失问题:BigDecimalpublic static void main(String[] args) { BigDecimal b1 = new BigDecimal(Float.toString(1.2f)); BigDecimal b2 = new BigDecimal(Float.toString(1)); float s = b1.subtract(b2).floatValue(); System.out.println("s----" + s);}
这样得到的结果就是正确的。
转载地址:http://ncyki.baihongyu.com/