读书人

数值变换和提升

发布时间: 2012-12-23 11:28:15 作者: rapoo

数值转换和提升

首先,看一个测试程序:

?

?

原因:

?

赋值转换: 发生在把表达式的值赋给变量的时候,表达式的类型必须转换成变量的类型.赋值上下文允许等同转换,放宽基本转换或者放宽引用转换.

例外,如果满足以下全部条件,也可以使用缩窄基本转换:
1. 表达式是int类型的常数表达式
2. 变量类型是byte,short或char
3. 表达式的值可以用变量的类型表示

?

数值提升: 作用于算术操作符的操作数.
有两种数值提升,它们是单目数值提升(单个操作数)和双目数值提升(二个操作数).
单目数值提升: 把类型为byte,short或char的操作数转换成int,否则不对操作数操作.

双目数值提升:
?????如果有一个操作数是double类型的,则把另一个转换成double.
?????如果有一个操作数是float类型的,则把另一个转换成float
?????如果有一个操作数是long类型的,则把另一个转换成long
?????否则,则把两个操作数都转换成int类型.

---------------------------------------------------
对于上述二条语句都是先进行数值提升,再进行赋值转换(赋值的优先级低于数值操作).

?

语句: byte c = 2+3;?满足赋值转换缩窄基本转换的全部条件.

?

?

所以,2+3表达式结果值类型为int,可以通过缩窄转换成byte型,赋值给byte类型变量c.

?

而语句: byte c = a+b; 不满足第一条(其表达式是变量表达式).

对于,语句: byte c = a+b; 先发生数值提升操作(双目数值提升),将表达式结果转换成int类型,然后执行int类型值赋值给byte变量的操作.

?

所以,a+b在数值提升阶段将a,b放宽到int类型,运算后的表达式结果值也为int型.

赋这结果值值给byte类型变量就会损失精度,出现编译期错误.

?

类似语句:

byte d = '3'; // 编译通过char c = '3';d = c; // 编译不通过,单目数值提升阶段将c的类型提升为int类型,然后赋值给byte类型变量.int e = c; // 编译通过,由此粗略可见上一条语句中字符型变量c被提升为int类型.

?

读书人网 >编程

热点推荐