JAVA中有八种基本类型:
四种整型:byte,short,int,long
两种浮点类型:float,double
一种字符型:char
布尔类型:boolean
各个整型和浮点型的存储需求以及取值范围
原码,反码,补码
原码:
将一个数值采用二进制的方式表示,得到的就是原码。最高位为符号位,1表示负数,2表示整数。
反码:
因为计算机只有加法,没有减法,在做减法运算的时候,可以认为是加上一个负数,这样可以减少计算机电路的复杂度。使用原码进行减法运算会出现问题,为了解决减法的问题,计算机引入了反码。
正数的反码与原码相同;负数的反码是由原码除符号位外,其它位取反,即“0”变成“1”,“1”变成"0"
补码:
为了解决减法产生的正负零的问题,计算机引入了补码。
正数的补码与原码相同;负数的补码是由原码除符号为外,其他位取反,加一变换而成,即反码+1
为什么byte类型数值范围是127——(-128)
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中有一个类,专门解决精度`丢失问题:BigDecimal
public 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);
}
这样得到的结果就是正确的。