Java基本数据类型有四类总共八种,整型(byte,short,int,long),浮点型(float,double),字符型(char),布尔型(boolean)。
类型 |
字节数 |
取值范围 |
byte |
1 |
-2^7到2^7 |
short |
2 |
-2^15到2^15 |
int |
4 |
-2^31到2^31 |
long |
8 |
-2^63到2^63 |
char |
2 |
0~2^16-1(Unicode码) |
float |
4 |
1位符号位,8位指数,23位有效尾数 |
double |
8 |
1位符号位,11位指数,52位有效尾数 |
boolean |
1 |
前七位是0 |
注意事项: 二 进 制 浮 点 数 : 1010100010=101010001.0*2=10101000.10*2^10(2次方)=1010100.010*2^11(3次方)= . 1010100010*2^1010(10次方) 尾数: . 1010100010 指数:1010 基数:2 浮点数字面量默认都为 double 类型,所以在定义的 float 型数据后面加F 或 f;double 类型可不写后缀,但在小数计算中一定要写 D 或 X.X float 的精度没有 long 高,有效位数(尾数)短。 float 的范围大于 long 指数可以很大。 浮点数是不精确的,不能对浮点数进行精确比较。
基本数据类型转换
基本数据类型转换一般分为自动转换和强制转换,但是需要注意的是:boolean类型不能与其他基本数据类型进行转换,否则,编译出错。
自动转换
不同的数据类型都会有与其储存空间相匹配的取值范围。所以对于默认为int类型的数值时,当赋给一个比int类型数据范围更小的数值类型变量时,比如byte,那么将会出现编译出错。因为byte的储存空间无法容纳,这个时候必须进行强制转换。
从存储范围小的类型到存储范围大的类型.
byte ->short(char)->int->long->float->double
需要注意的是:char型其本身是unsigned型,同时具有两个字节,其数值范围是0 ~ 2^16-1,因为,这直接导致byte型不能自动类型提升到char,char和short直接也不会发生自动类型提升(因为负数的问题),同时,byte当然可以直接提升到short型。
强制转换
从存储范围大的类型到存储范围小的类型。强制转换:①会损失精度,产生误差,小数点以后的数字全部舍弃。②容易超过取值范围。
double→float→long→int→short(char)→byte
当我们需要将数值范围较大的数值类型赋给数值范围较小的数值类型变量时,由于此时可能会丢失精度(1讲到的从int到k型的隐式转换除外),因此,需要人为进行转换。我们称之为强制类型转换。
java中数值类型转换的规则:
这个规则是《Java解惑》总结的:如果最初的数值类型是有符号的,那么就执行符号扩展;如果是char类型,那么不管它要被转换成什么类型,都执行零扩展。还有另外一条规则也需要记住,如果目标类型的长度小于源类型的长度,则直接截取目标类型的长度。例如将int型转换成byte型,直接截取int型的右边8位。
多学一点:表达式类型自动提升
所谓表达式是指由变量和运算符组成的一个算式。变量在表达式中进行运算时,也可能发生自动类型转换,这就是表达式数据类型的自动提升,下面看两个表达式:
short a=1;a=a+1;
short a1=1;a1+=1;
你会发现第一个表达式有错误提示,因为a+1运算时会自动提升表达式的类型,也即int类型,再将结果赋值给short类型时,类型不匹配。
而第二个表达式未出现错误,因为java编译器会对+=进行特殊处理,进行了类型转换,通过反编译.class源码可以看到a1+=1被编译成a=(short)(a1+1);