整型,字符型,浮点型的数据再混合运算中相互转换,转换时遵循以下原则:
1.容量小的类型默认转换为容量大的数据类型;数据类型按容量大小排序为:
byte,short,char->int->long->float->double
byte,short,char之间不会相互转换,他们三者再计算时首先会转换为int类型
2.容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能
造成精度降低或者溢出;使用时要格外注意-----------数据类型的强转
3.有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的
那一种数据类型,然后在进行计算 ------------------数据类型的提升
public class Demo4{
public static void main(String[] args){
byte b = 10;
b = b + 20;//这是错误的
b = (byte)(b+20);//这是正确的,(byte)作为强制转换转换b+20,b+20里面先做了一个数据类型的提升变为了int。
可能会损失精度。因为混合计算要先转换成数据类型容量最大的哪个,20默认为int类型,所以会把b先转换成为byte,计算的结果的数据类型就是int,但是因为接收数据的b是byte类型,容量大的数据类型向容量小的数据类型转换需要进行强制转换。但可能会造成精度降低或者溢出。
//byte c = 500;这是错误的
这里 500超过了本身byte的取值范围。
500默认是int类型也就是4字节,但是byte是1字节。
直接把4字节放入1字节空间是不可能的。
byte c1 = (byte)(500);//byte取值范围是-128--127
表示将4字节的500强制转换成1字节空间,但是此处存在精度降低;
byte b3 = (byte)500;//-12
111110100
因为在代码中数字是以二进制的补码来表示的。
所以500的二进制是: 111110100
因为进行了强制转换所以剩下了8位:11110100补码负数的补码是反码+1所以这里减去一个一,变成了下面的反码
11110011
10001100负数的反码是源码的除去符号位的相反,除了第一位以外全部取反
结果是:-12这是他溢出以后的结果
69 + 87 = -100//为什么?
在java中,int 占用2字节,byte 占用1字节。
69用int的二进制表示为:00000000 01000101 ,87表示为:00000000 01010111,二者相加得:00000000 10011100,强转为byte,舍去高8位 ,得到 :10011100 ,如果是无符号数就是十进制:156,如果是有符号数就是 -100的补码表示形式。
}
}
//数据类型的自动提升(整型提升成浮点型,就是给其之后带一位小数,且值是0)
double d = 100;
System.out.println(d);//100.0
//数据类型的强制转换(浮点型强转成整型,直接干掉小数部分)
int a = (int)314.5;
System.out.println(a);//314
System.out.println("========================");
byte b4 = 10;
byte b5 = 20;
/*
b4 + b5 --->在运算过程中b4和b5都会自动提升成为4字节的10和20,
所以计算的结果是4字节的30;
byte b6 = b4 + b5; 再将计算得来的4字节的30赋值给1字节的b6,肯定
不可能;
所以也需要强转 byte b6 = (byte)(b4 + b5);
*/
char c = 'a';
System.out.println(c+1);//98 'a'--->97 自动提升
System.out.println((int)c);//强制提升