Java中byte、short、char、int、long运算时自动类型转化问题
--------------------------------------------------------------------------------------------------
★★自动(隐式、默认)类型转换与强制(显式)类型转换★★
1) boolean类型不参与转换
2) 默认转换
A:从小到大
B:byte,short,char --» int --» long --» float --» double
C:byte,short,char之间不相互转换,直接转成int类型参与运算。
3) 强制转换
A:从大到小
B:可能会有精度的损失,一般不建议这样使用。
C:格式:
目标数据类型 变量名 = (目标数据类型) (被转换的数据);
★★表达式的式值★★
int a = 10;
int b = 20;
int c = (a = b); //赋值式本身也是表达式,所以它也有式值!!!
--------------------------------------------------------------------------------------------------
大家都知道,在进行运算时,Java会隐式的自动进行类型转化。那么有哪些情况会进行转化呢?总结如下:
(一)算术运算符
1) 单目运算符:+(取正)、-(取负)、 ++(自增1)、 --(自减1)
a) +(取正)、-(取负)
当操作数是byte,short,char时,会自动转化为int类型;返回结果为int。
当操作数是int,long时,不转化,原来是啥类型,还是啥类型。
b) ++(自增1)、 --(自减1)
不管操作数是啥类型,不转化。
2) 双目运算符:+、 -、 *、 /、 %(取余)
当两个操作数中没有long类型时,两个操作数中非int类型会先自动转换为int类型,再参与运算,返回结果为int;
当两个操作数中含有long类型时,两个操作数中非long类型会自动转换为long类型,再参与运算,返回结果为long;
(二)位运算符
1) &(按位与)、|(按位或)、^(按位异或)
当两个操作数中没有long类型时,两个操作数中非int类型会先自动转换为int类型,再参与运算,返回结果为int;
当两个操作数中含有long类型时,两个操作数中非long类型会自动转换为long类型,再参与运算,返回结果为long;
2) ~(按位非)
当操作数是byte,short,char时,会自动转化为int类型;返回结果为int。
当操作数是int,long时,不转化,原来是啥类型,还是啥类型。
3) << (带符号左移)、 >>(带符号右移)、 >>> (无符号右移)
当操作数是byte,short,char时,会自动转化为int类型;返回结果为int。
当操作数是int,long时,不转化,原来是啥类型,还是啥类型。
(三)赋值运算符
1) 基本赋值运算符:=
a) 变量 = 变量:小赋大,自动转;大赋小,不自动转换;
b) 变量 = 常量:不自动类型转换
2) 扩展赋值运算符:+=、-=、*=、/=、%=
这里需要特别说明一下,扩展赋值运算符隐含了强制类型转换,即: ※※ s += 1 等价于 s = (s的数据类型)(s + 1) ※※
★★总结★★
※除了自增和自减不进行转化外,其它情况都是无long型时,所有非int类型转成int类型;有long类型时,都转成long类型(简称:运算中无long,int称大王。。。)※