1. 基本数据类型转换
不同数据类型在参与运算时的默认转换(从小的类型转换为大的类型):
byte、short、char–>int–>long–>float–>double
注意事项:
- byte、short、char相互之间不转换,他们参与运算首先转换为int类型(即使与常量进行运算,他们也会先转为int类型)
- 相同类型参与运算,最终结果只会是该类型
- float表示的数据范围比long大1
2. 原码、反码、补码
1. 原码
概念: 最高位表示符号位,0为正数,1为负数,非符号位为该数绝对值的二进制表示
示例:
127的原码为0111 1111
-127的原码为1111 1111
2. 反码
概念: 正数的反码与原码相同,负数的反码是其原码按位取反,符号位(最高位)不变
示例:
127的反码为0111 1111
-127的反码为1000 0000
3. 补码
计算机中数据的运算都是基于补码进行的
概念: 正数的补码与原码相同,负数的补码是其反码加1,符号位(最高位)不变
示例:
127的补码为0111 1111
-127的补码为1000 0001
3. 数据溢出
概念: 当把容量大的数据类型转换为容量小的数据类型就有可能发生数据溢出
示例:
int类型的2020其原码、反码、补码都是00000000 00000000 00000111 11100100
当其转换为byte类型时,由于byte类型只有八位,所以取11100100(当前为补码)
补码减1转为反码:11100011
反码取反转为原码(符号位不变):10011100
转为十进制为最终结果:-28
测试代码如下:
/**
* byte类型为8位二进制,其取值范围为-128~127
* 所以当前语句会产生编译错误
*/
byte a = 130;
/**
* 使用强制类型转换可以避免编译错误
* byte类型参与运算会先转换为int类型
* 130的原码、反码、补码都是00000000 00000000 00000000 10000010
* 强转为byte类型,取8位:10000010(当前为补码)
* 补码减1转反码:10000001
* 反码取反转原码(符号位不变):11111110
* 最终结果:-126
*/
byte b = (byte)130;
Sysout.out.println(b); //-126
float与long底层的存储结构不同,long类型是整数二进制,float类型是科学计数法 ↩︎