您的位置:首页 > 编程语言 > Java开发

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

2015-11-09 15:08 645 查看
曾经在笔试中考到:“在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.html/article/7079155.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。如有错误,还请指正,非常感谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: