JAVA——基本数据类型之间的自动转换

曾经在笔试中考到:“在java里,byte a=100,b=200;能否通过编译?”,当时我一脸的茫然,记不清哪个教科书里写过这类东西,于是考完后进行了实验,得到了如下的发现,现与大家分享下。

赋值的形式通常是:

A = B ;

A通常是一个变量或常量(但不能是字面值),A的数据类型记为S_A。B可以是一个变量值、表达式的值、字面值或方法返回值,对应的数据类型记为S_B。

字面值,指诸如:1234, 'a', 1234L, 1234.0f, 1234.1形式的值;

表达式的值,这里指算术表达式的值,变量、常量和字面值都是算术表达式的组成部分。

常量值,指被final关键字修饰的变量的值。

方法返回值,视为一个变量的值即可。


  • 规则一:若S_B对应的数值范围在S_A对应的数值范围之内,那么可以安全地进行数值类型转换,编译通过。(这个是多数教科书会写出来的,也有不少人描述过,如:http://www.weixueyuan.net/view/5957.htmlhttp://www.cnblogs.com/andy2005/archive/2006/07/24/458564.htmlhttp://jingyan.baidu.com/article/5552ef4735e7fd518efbc940.html等)
  • 规则二:若S_A和S_B为整数类型或字符型(byte, short, int, long, char),B是字面值、常量值或常量表达式(即由常量或字面量构成的表达式)的值,且在S_A对应的数值范围之内(其数据类型对应的数值范围可以超出),那么在编译期间也可以安全地进行数值类型转换,编译通过。(这个规则是隐含在编译器中的;想想也是,机器能做的事就不要麻烦我们人去做)


下面给出几个例子:

char c=64;//通过,对应规则二。 

int a='a';//通过,对应规则一。 

char d='a'+10;//通过,对应规则二。 

char e=65535;//通过,对应规则二。 

e=65536;//超出范围了,不通过,对应规则二。 

double s='b';//通过,对应规则一。 

byte bb=10,bc='a';//通过,对应规则二。 

byte bd='a'+1;//通过,对应规则二。 

byte bf='a'+250;//超出范围了,不通过,对应规则二。 

byte be=1.0;//浮点数无法自动转为整数,即便是1.0,不通过。 


final byte fba=10,fbb=118;//通过,对应规则二。

  /*fba是常量,整个表达式的值对应的类型虽然是int,但在编译期间就能够确定下来,因为是常量表达式,且未超出范围。通过,对应规则二。*/

byte bg=fba+30;


/*bb不是常量,所以没法在编译期间确定值,为安全起见,需要显示地进行数据类型转换。对应规则二。*/
byte bh=fba+bb;//不通过
byte bk=(byte)(fba+bb);//通过。显示地强制类型转换。

/*算术表达式最窄提升到int型,所以即使两个byte相加(只要有一个既不是字面值也不是常量,否则的话还要看看最终的值是否超出范围),也要用int型变量存储。对应规则二*/
short sh=fba+bb;//不通过

int ish=fba+bb;//通过



 
 
本文采用的实验环境是jdk1.7.0_21。如有错误,还请指正,非常感谢。得意 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值