3.4 浮点家族变量
public class TestDemo { public static void main(String[] args) { float f = 10.2F; System.out.println(Float.MAX_VALUE); //打印 float 能存储的最大值 System.out.println(Float.MIN_VALUE); //打印 float 能存储的最小值 double d = 12.5; System.out.println(Double.MAX_VALUE); //打印 double 能存储的最大值 System.out.println(Double.MIN_VALUE); //打印 double 能存储的最小值 } }
double 和 float 类型的内存布局遵守 IEEE 754 标准(和C语言一样), 尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差,因此浮点数是个近似值,并不是精确值。
3.5 布尔类型变量
public class TestDemo { public static void main(String[] args) { boolean b = false; System.out.println(b); } }
这里有几点需要注意:
- boolean 类型的变量只有两种取值 true 和 false
- Java 中布尔类型不能与其他类型互相转换,不存在 0 为假 非0 为真的说法
- Java 虚拟机规范中,并没有规定 boolean 占几个字节,在 Oracle 公司的虚拟机实现中 boolean 占 1 个字节
4、类型转换
4.1 什么是类型转换?
在我们之前学习C语言的时候,就已经接触过类型转换了,类型转换简单来说,就是把一个数据类型转换成不同的类型, Java作为一个强类型编程语言,在不同类型变量之间相互赋值的时候,会有比C语言更严格的校验。
举一个很简单的例子,在C语言中,你把一个 double 变量直接赋给一个 int 变量时编译器最多报一个 warning 但是仍然可以编译通过,而在Java中则会直接编译失败,这是我们就需要用到强制类型转换!
4.2 隐式类型转换
所谓隐式类型转换,就是我们不需要手动转换,编译器已经帮我们转换了,最显然的例子就是,当一个数据范围小的存到数据范围大的中编译器会自动帮我们完成转换:
public class TestDemo { public static void main(String[] args) { /** * 隐式类型转换 -> 数据范围小的数转为数据范围大的时候! * 注意:不相关的类型不能互相转化 例如:布尔类型和值类型 */ int a = 10; long l = 100; l = a; //编译器会将 a 转换为 long,然后进行赋值 float f = 3.14F; double d = 5.12; d = f; //编译器会将 f 转换为 double,然后进行赋值 } }
4.3 强制类型转换
强制类型转换,就好比一个水壶它只能装1升水,但是你硬要装2升水,显然多的水会溢出,也就是被丢弃,在计算机中,当一个数在一个类型能表示的范围之外,那么强制类型转换显然是可能会丢失数据的!
public class TestDemo { public static void main(String[] args) { /** * 显式类型转换 -> 数据范围大的数转为数据范围小的时候需要显式类型转换 * 注意:不想关的类型不能互相转化 例如:布尔类型和值类型 */ int a = 10; long l = 100; a = (int)l; //long -> int 数据范围由大到小,需要强转,否则编译失败 byte = (byte)288; //288默认是int,超过了byte的存储范围,需要强转,否则编译失败 } }
5、类型提升
5.1 int与long之间的那些事
在Java中,针对类型检查是很严格的,就比如上面,如果你把一个类型大的放到类型小的就会报错,那如果我们将 int类型与long类型相加会发生什么呢?
public class TestDemo { public static void main(String[] args) { int a = 10; long l = 100; int c = a + l; //编译报错 long l2 = a + l; //编译通过 } }
我们先来看到编译报错那条语句,为什么会编译报错?当我们在进行不同类型运算的时候,范围小的会被提升成范围大的,在这个代码中,也就是 a 被提升成 long 类型进行运算,long + long 最后的结果肯定是一个 long 类型的值,所以在赋值给一个 int 类型变量会报错,我们可以将他们最后的结果强转成 int 但是可能是会造成数据丢失。
当然,如果我们 int 类型变量与 double类型变量运算,也是会先把 int 提升到 double 的,这个下来自己可以动手去一一测试一下。
5.2 小于四个字节的类型变量如何运算?
目前我们已知小于四个字节的类型有:byte,char,short 那么他们之间的变量运算又是怎么一回事呢?
这里发现报错了,int 转到 byte 显然是不行的,通过代码,我们可以看到,在不满足4个字节大小的类型变量,会先提升到 int 类型,在进行运算,那么显然他们的计算结果肯定也是 int 当一个 int 类型值放入一个 byte 类型变量中肯定是不行的,所以这里有两个解决办法:将他们的结果强制类型转换,或者拿一个整型变量来接收他们计算的结果值。