数值转换和提升

首先,看一个测试程序:

 

/**
 * Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC)
 * All rights reserved.
 * Author: Jarg Yee <yeshaoting@gmail.com>
 * http://jarg.iteye.com/
 */

public class Test
{
	public static void main(String[] args)
	{
		byte a = 2,b = 3;
		byte c = 2+3;
		//byte c = a+b;
	}
}

 

 对于语句: byte c = 2+3;能顺利编译通过.

 但是对于语句: byte c = a+b;却出现下图所示的编译期错误,错误原因是数值转换可能损失精度.

 

原因:

 

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

例外,如果满足以下全部条件,也可以使用缩窄基本转换:
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类型.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值