Java的基本数据类型
一、Java的基本数据类型
java是一种强类型的语言,在java中一共有8种基本数据类型。
二、各种类型的存储容量以及取值范围
首先要了解计算机存储方式,字节bit是计算机信息技术用于计量存储容量和传输容量的一种计量单位,也是计算机的磁盘存储的最小单位,1个字节等于8位二进制。
三、为什么byte类型的127 +1会变成-128
计算机对于二进制数据的存储形式(以byte类型为例)
原码:45:00101101 -45:10101101
在最高位代表符号位区分正数还是负数,0代表正数,1代表负数
反码:45:00101101 -45:11010010
正数的原码和反码相同,负数的反码等于原码的符号位不变,其余各位按位取反
补码:45:00101101 -45:11010011
正数的原码反码和补码都形同,负数的补码等于在其反码基础上末尾+1
首先计算机对于二进制数据,采取补码存储,补码又是由反码来的。
反码:是为了解决计算机处理减法运算。在做减法运算的时候,可以认为是加上一个负数,这样可以减少计算机电路的复杂度。而有原码直接进行运算会出现错误,因此反码诞生。
1-1=1+(-1)=[00000001]原+[10000001]原=[10000010]原=-2 (符号位也参与运算)与实际结构不符
1-1=1+(-1)=[00000001]原+[10000001]原=[00000001]反+[11111110]反=[11111111]反=[10000000]原=-0
可以看到的是,通过反码,我们可以计算出正确结果,但会多出一个±0。因此为了解决±0,问题补码诞生。
总结:反码是为了解决减法运算,补码是为了解决反码产生的±0的问题。
正数:原码,反码,补码一样,负数,反码等于原码取反,符号位不变,补码等于反码加1
回到最初的问题+127:0111 1111、加上+1:0000 0001、等于1000 0000也就是现在的规定的-128。
设计成这样也是为了方便计算机的计算(存储格式为补码)
浮点类型以及精度丢失问题
浮点类型存储方式
精度丢失问题
public class SimpleTest {
public static void main(String[] args) {
System.out.println(1.2 - 1);
}
}
```输出的结果会是0.19999999
我们来将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进制从上到下可以表示为 00110......
注意:上面的计算过程循环了,也就是说*2永远不可能消灭小数部分,这样算法将无限下去。很显然,小数的二进制表示有时是不可能精确的 。其实道理很简单,十进制系统中能不能准确表示出1/3呢?同样二进制系统也无法准确表示1/10。这也就解释了为什么浮点型减法出现了"减不尽"的精度丢失问题。
解决办法
使用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);
}
四、char类型
用于存储1个字符,经常和它比较的有String类型,不过String类型不属于基本数据类型,属于引用数据类型,可以看作是char类型的数组。
五、boolean类型
只有ture和flase两种类型。