数据类型转换
什么时候会发生数据类型转换:Java程序要求参与计算的数据必须保持数据类型的一致性,如果不一致就会发生数据类型转换。
自动类型转换
定义:将取值范围小的类型自动提升为取值范围大的类型
public class Main {
public static void main(String[] args){
byte b=2;
int x=b;
System.out.println(x);
}
}
运行结果
2
转换原理
byte类型占一个字节,int类型占4个字节,不足的字节高位补0
int x=b;
即
00000010——>00000000 00000000 00000000 00000010
转换规则
范围小的向范围大的进行转换,
注意: byte,short,char运算时会自动转换为int
下面会出现什么结果
byte b=2;
byte x=b+1;
System.out.println(x);
编译出错
原因: b+1中对byte类进行了运算,则b+1的类型为int,int类型不能直接转换为比它范围小的数据类型。如果非要转换就要使用强制类型转换了
强制类型转换
定义: 将数据范围大的强制转换为数据范围小的
转换格式:
数据类型 变量名=(数据类型)被转数据值
例子
int x=2;
byte b=(byte)x;
练习
下面代码中1和2哪个编译不通过还是全编译不通过
public class Main {
public static void main(String[] args){
short s=1;
s=s+1; //1
s+=1; //2
}
}
答案
第一个编译不通过: s+1中s会自动转换为int,而int类型不能直接转换为short类型,需要对其强制类型转换
第二个编译通过:s+=1相当于s=(s的数据类型)s+1既想当于s=(short)(s+1)
注意:
- 浮点型转换为整型时,小数点后的数字会直接舍弃,造成精度的缺失
- 整形转换为short,byte时会造成高位数据的丢失
例子:
public class Main {
public static void main(String[] args){
double d=3.14;
int x=(int)d;
System.out.println(x);
System.out.println("==============");
int y=128;
byte b=(byte) y;
System.out.println(b);
}
}
运行结果
3
==============
-128
第二个为什么等于-128呢?
128的二进制表示形式为 00000000 00000000 00000000 10000000
而转换为byte后变为10000000存储在内存中,而数据的存储是以补码形式存储的,及10000000的真值为-128
原码,反码,补码
原码:值的二进制表示形式
反码:正数的反码等于原码,负数的反码符号位(最高位)不变(0为正,1为负),低位取反(0变1,1变0)
补码:正数的补码等于原码,负数的补码为反码+1;(数据是以补码进行存储的)
为什么不用原码存储数据
因为原码数据做运算时会出错,而补码不会
例如: byte中的 -4+4
原码运算
10000100
+00000100
-----------
=10001000(-8不等于0)
补码运算:
-4存储在内存的二进制表示为->11111100
所以-4+4的运算为:
11111100
+00000100
-----------
=100000000(等于0)