关于类型转换——byte类型相加引发的编译出错

由一道题引入:

public class BadArithmetic {

	static byte addOneAndOne(){
		
		byte a = 1;
		byte b = 1;
		byte c = a+b;
		return c;
	}
}


在低版本的eclipse中,结果是编译错误:BadArithmetic.java (7): Incompatible type for declaration.

Explicit cast needed to convert int to type.

byte c = a+ b;

类型转换原因:Java类型转换,需要进行基本类型转换工作的操作码(见附表)。这些执行转换工作的操作码后面没有操作数。转换的值从栈顶端获得。java虚拟机从栈顶端弹出一个值,对它进行转换,然后再把转换结果压入栈。

 

分析:

Java虚拟机没有把long,float,double类型值直接转换为比int类型占据更小空间的数据类型的操作码。因为,把float类型值转化为byte类型需要两个步骤。

首先,float类型值必须通过f2i指令转换为int类型值。

然后,所得的int类型再通过i2b指令转换为byte类型值。

 

尽管有操作码可以把int类型值转化为比int类型值占据更小空间的数据类型(byte,short和char),但并不存在执行相反方向转换的操作码。

因为任何byte,short和char类型在压入栈的时候,就已经有效地转化成int类型值。从数组或者堆中的对象中接受byte,short,和char类型值

的指令和把这些压入栈的指令都会把他们转换为int类型,然后对int类型值进行运算。

 

所以上诉代码出现的a+b是int类型,补救为

public class GoodArithmetic {
	static byte addOneAndOne() {
		
		byte a = 1;
		byte b = 1;
		byte c = (byte)(a+b);
		return c;
	}

 

附表:类型转换的操作码

int,long,float和double类型之间的相互转换

操作码

操作数说明

i2l

(无)

将int类型转换为long类型值

i2f

(无)

将int类型转换为float类型值

i2d

(无)

将int类型转换为double类型值

l2i

(无)

将long类型转换为int类型值

l2f

(无)

将long类型转换为float类型值

l2d

(无)

将long类型转换为double类型值

f2i

(无)

将float类型转换为int类型值

f2l

(无)

将float类型转换为longt类型值

f2d

(无)

将float类型转换为double类型值

d2i

(无)

将double类型转换为int类型值

d2l

(无)

将double类型转换为long类型值

d2f

(无)

将double类型转换为float类型值

 

 

 


 

 

int数据类型向byte,char,short类型的转换

操作码操作数说明

i2b

(无)

将int类型值转换为byte类型值

i2c

(无)

将int类型值转换为char类型值

i2s

(无)

将int类型值转换为short类型值

 

 

 
----------参考《深入Java虚拟机》原书第2版
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值