1、java的8种基本数据类型:
数据类型 | 位数 | 默认值 | 范围 | 举例说明 |
---|---|---|---|---|
byte(位) | 8 | 0 | -2^7 ~ 2^7-1 | byte b = 10 |
short(短整数) | 16 | 0 | -2^15 ~ 2^15-1 | short s = 10 |
int(整数) | 32 | 0 | -2^31 ~ 2^31-1 | int i = 10 |
long(长整数) | 64 | 0 | -2^63 ~ 2^63-1 | long l = 10l |
float(单精度) | 32 | 0.0 | -2^31 ~ 2^31-1 | float f = 10.0f |
double(双精度) | 64 | 0.0 | -2^63 ~ 2^63-1 | double d = 10.0d |
char(字符) | 16 | null | 0 ~ 2^16-1 | char c = ‘c’ |
boolean(布尔值) | 8 | false | true、false | boolean b = true |
在Java中,数据类型的范围与运行Java代码的机器无关。这是因为Java程序必须保证在所有机器上都能够得到相同的运行结果,所以每一种数据类型的取值范围必须固定。这就解决了软件从一个平台移植到另个平台,或者在同一个平台中的不同操作系统之间进行移植给程序员带来的诸多问题。
2、基本类型的自动转换
在图中有6个黑色箭头,表示无信息丢失的转换;有3个红色箭头,表示可能有精度损失的转换。例如,123456789是一个大整数,它所包含的位数比float类型所能够表达的位数多当将这个整型数值转换为float类型时,将会得到同样大小的结果,但却失去了一定的精度
int n = 123456789;
float f = n;// f 的值为 1.23456792E8
当使用两个不同类型数值进行二元操作时(例如n+f,n是整数,f是浮点数),会自动将两个操作数转换为同一种类型,然后再进行计算:
- 如果两个操作数中有一个是 double类型的,另一个操作数就会转换为 double类型。
- 否则,如果其中一个操作数是float类型,另一个操作数将会转换为float类型。
- 否则,如果其中一个操作数是long类型,另一个操作数将会转换为long类型。
- 否则,两个操作数都将被转换为int型
- 当两个byte类型相加并结果超出其表示范围
byte b1 = Byte.MAX_VALUE;
byte b2 = 1;
System.out.println(b1 + b2); //byte的范围为:-128~127,输出结果为128,可见其数据类型已自动转换
- 当两个short类型相加并结果超出其表示范围
short s1 = Short.MAX_VALUE;
short s2 = 1;
System.out.println(s1 + s2); //short的范围为:-32768~32767,输出结果为32768
- 当两个int类型相加并结果超出其表示范围
int n1 = Integer.MAX_VALUE;
int n2 = 1;
System.out.println(n1 + n2); //int的范围为:-2147483648~2147483647
总结:byte,short自身来计算的时候有类型的提升,二元操作时自动转为int类型;int,long,float,double自身来计算的时候没有类型的提升,如果超出范围了就会出现精度的损失