java的类型转换
0.在java中,整数默认为int类型,浮点数默认为double类型。
1.定义长整型(long)时,必须要加后缀L或l。 如long earthPeople=7_000_000_000L;
2.定义单精度(float)时,必须要加后缀F或f。 如float wage=2000.354f;
3.数值类型之间的转换:自动转换(隐式转换) 强制转换(显式转换)
4.转换图 6个实心箭头表示无信息丢失的转换,3个虚线箭头表示可能有精度损失的转换
5.隐式转换:由小到大,数据类型自动提升
byte,short,char -->int -->long -->float -->double
换一种说法:当使用两个数值进行二元操作时,首先要将两个操作数转换为同一类型,然后再进行计算。
转换规则:(一)两个操作数有一个是double类型,另一个操作数就会转换为double类型;
(二)否则,有一个操作数是float类型,另一个操作数就会转换为float类型;
(三)否则,有一个操作数是long类型,另一个操作数就会转换为long类型;
(四)否则,两个操作数都将被转换为int类型。
如
byte a=20;
int b=a;
虚拟机会将赋值运算符右边的变量a转换为int类型,然后再赋值给左边的变量b。
例1:
short a=10;
a=a+2;
//a=a+(short)2;这样也会报错,参考转换规则(四)
编译时会报错: 不兼容的类型: 从int转换到short可能会有损失
原因: a+2会隐式转换地将结果为int类型,将int类型赋值给左边的short类型变量,会有数据损失,所以会报错
处理办法:a=(short)(a+2);
对比
short a=10;
a+=2;
此时不会报错。
a+=2;虽然可以看做a=a+2;,但还是有区别的。a+=2中有一个强制转换,即a=(short)(a+2),会把a+2的值强制转换为short类型,故不会报错。
例2:
short a=20;
short b=30;
b=a+b;
亦会报错,原因与例1同理
需要注意的是,在整数之间进行类型转换时,数值不发生改变。而将整数类型,特别是比较大的整数类型转换成浮点类型时,由于存储方式不同,有可能存在数据精度的损失。
如
int n=123456789;
float f=n; //f=1.23456792E8
6.显式转换
格式: (转换后的数据类型)变量或值;
一般情况下,根本不推荐使用强制类型转换。
强制类型转换通过截断小数部分将浮点值转换为整型。
如
double x=9.997;
int y=(int)x; //y的值为9
例3:
byte b=(byte)130;
System.out.println(b); //打印结果-126
原因:
十进制数130转换为二进制:10000010
在内存中表示为
原码:00000000 00000000 00000000 10000010 因为是正数,所以原码反码补码都一样
补码:00000000 00000000 00000000 10000010
对补码进行截取,取剩下最后8位(即1个byte大小):10000010
10000010是补码。因为符号位是1所以该数是负数。
反码:10000001 ——>原码11111110
转换为十进制数为-126。