基本数据类型转换
基本数据类型
数据类型 | 所占字节 | 取值范围 |
boolean | 未定 | false与true |
byte | 1个字节 | -2^7~2^7-1 |
char | 2个字节 | 0~2^16-1 |
short | 2个字节 | -2^15~2^15-1 |
int | 4个字节 | -2^31~2^31-1 |
long | 8个字节 | -2^63~2^63-1 |
float | 4个字节 | -2^128~+2^128 |
double | 8个字节 | -2^1024~+2^1024 |
方法调用规则
从低位类型到高位类型自动转换;从高位类型到低位类型需要强制类型转换:
- 布尔型和其它基本数据类型之间不能相互转换;
- byte型可以转换为short、int、long、float和double;
- short可转换为int、long、float和double;
- char可转换为int、long、float和double;
- int可转换为long、float和double;
- long可转换为float和double;
- float可转换为double;
编辑
隐式类型转换
隐式转换也叫作自动类型转换, 由系统自动完成.
从存储范围小的类型到存储范围大的类型.
byte ->short(char)->int->long->float->double
在整数型转换浮点型时可能会出现精度丢失。
显式类型转换
显示类型转换也叫作强制类型转换, 是从存储范围大的类型到存储范围小的类型.
当我们需要将数值范围较大的数值类型赋给数值范围较小的数值类型变量时,由于此时可能会丢失精度,因此,需要人为进行转换。我们称之为强制类型转换。
double→float→long→int→short(char)→byte
int a=128;
byte b=(byte)a;
System.out.println(b);
结果为-128。
为什么结果是-128?需要从最根本的二进制存储考虑。
- java采用补码存储整数,int型为32位,128的二进制表示为:00000000 00000000 00000000 10000000,
- byte型只有8位,于是从高位开始舍弃,截断后剩下:10000000,
- 补码表示的时候第一位是符号位,0正1负,
- 所以可以知道10000000肯定是一个负数了,再来看它的数值部分,
- 因为正数127的原码是:0111 1111,则-127的原码是1111 1111
- (将对应的整数的符号位改为1即得到该负数的原码)
- -127的反码是:1000 0000
- (将对应的原码除符号位(最高位)外,其余为全部取反(0变1,1变0))
- -127的补码是:1000 0001
- (将对应反码,在末尾加1,即得到补码)
- -128的补码是:1000 0000
- (-127在减去1等于-128)
进行运算时的转换
进行数学运算时的数据类型自动提升与可能需要的强制类型转换。
当进行数学运算时,数据类型会自动发生提升到运算符左右之较大者,以此类推。当将最后的运算结果赋值给指定的数值类型时,可能需要进行强制类型转换。例如:
int a=1;
byte b=0;
byte c=(byte)(a+b);
a+b会自动提升为int, 因此在给c赋值的时候要强制转换成byte.