1.数据类型
类型 | 存储需求 | 取值范围 |
---|---|---|
byte | 1 字节 | -128 ~ 127 |
short | 2 字节 | -32 768 ~ 32 767 |
int | 4 字节 | -2 147 483 647 ~ 2 147 483 647(正好超过20亿) |
long | 8 字节 | -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 |
float | 4 字节 | 大约 ± 3.402 823 47E+38F (有效位数 6 ~ 7 位) |
double | 8 字节 | 大约 ± 1.797 693 134 862 315 70E+308 (有效位数为 15 位) |
2.数值之间的转换规则
在图 3-1 中有 6 个实心箭头,表示无信息丢失的转换;有 3 个虚箭头, 表示可能有精度损失的转换。
当进行二元操作时,先要将两个操作数转化为同一种类型,然后再进行计算。
- 如果两个操作数中有一个是
double
类型, 另一个操作数就会转换为double
类型。 - 否则,如果其中一个操作数是
float
类型,另一个操作数将会转换为float
类型。 - 否则, 如果其中一个操作数是
long
类型, 另一个操作数将会转换为long
类型。 - 否则, 两个操作数都将被转换为
int
类型。
3.强制类型转换
/**
* 类型强制转换
* a = 9
* b = 10
*/
private static void typeCast(){
double d = 9.97;
int a = (int)d;
int b = (int)Math.round(d);
//int b = Math.round(d);
System.out.println("a = " + a);
System.out.println("b = " + b);
}
- a = 9 : 强制类型转换通过截断小数部分将浮点值转换为整型。
- b = 10 : 使用
Math.round()
方法对浮点数进行舍人运算, 以便得到最接近的整数 Math.round()
方法返回的结果为long
类型,由于存在信息丢失的可能性,所以只有使用显式的强制类型转换才能够将long
类型转换成int
类型。
4.特别注意
警告:如果试图将一个数值从一种类型强制转换为另一种类型, 而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。例如,(byte ) 300 的实际值为 44。
--《Java核心技术 卷1 基础知识 原书第10版》P41
/**
* 输出 b = 44
* @param args
*/
public static void main(String[] args){
byte b = (byte)300;
System.out.println("b = " + b);
}