A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1: byte a1 = 3;
2: byte a2 = 4;
3: byte a3 = a1 + a2;
4: byte a4 = 3 + 4;
为什么第四行不需要强制转换,而第三行需要
5;long b1=4;
6;long b2=5;
7;long b3=b1+b2;
8;long b4=4+5;
与byte不同为什么第7行不需要进行强转

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 小问题中见真理,加油、同学!.

查看全部评分

7 个回复

倒序浏览
a1和a2都是byte型的,相加的结果页是byte型的,所以不需要强转。低级别的数据类型在计算时会自动向级别类型的数据转换。这个是隐形转换。 byte- >short-> int->long->float->double 进行运算时两边的数据类型都是一致的,所以不需要强转换。

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
1.对于常量,byte类型相加不超过数据表达范围,都是可以的,对于变量相加,是不可以的,因为不确定在运行时会报丢失精度的错误。
2.至于long类型,是可以的,因它大于int类型的数据表达范围,不会再运行时报错。
回复 使用道具 举报
低精度的可以向高精度的自动转换,高精度向低精度时需要强制转换。
      同时赋值运算也有两种 :
       #1,当等号右边全是 常数时,只需判断运算结果是否越界,如果越界,则编译不能通过,
       如果没有越界,则直接赋值,不需要强制转换。
       #2,当等号右边有变量参与运算时,其中的byte,short 会先转换成int,在参与运算

点评

说的好,赞成。  发表于 2013-11-18 23:25

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 都有好评+1了。技术分能不加+1吗?.

查看全部评分

回复 使用道具 举报
低精度的可以向高精度的自动转换,高精度向低精度时需要强制转换。
      同时赋值运算也有两种 :
       #1,当等号右边全是 常数时,只需判断运算结果是否越界,如果越界,则编译不能通过,
       如果没有越界,则直接赋值,不需要强制转换。
       #2,当等号右边有变量参与运算时,其中的byte,short 会先转换成int,在参与运算
回复 使用道具 举报
解释一下为什么byte a4 = 3 + 4;不需要强制转换:
是因为在赋值运算时,右边如果有变量参与,那么结果最低都是int类型。如果右边没有变量参与,只要右边式子的值在这个类型的数值范围内就可以通过编译。byte的范围是-128~127.显然在这个范围内。
在解释一下long b3=b1+b2;为什么没有强制转换:
在对变量b1和b2进行赋值的时候就有隐示类型转换,都转为long型了,相加的结果也是long型,做运算的时候就没有类型转换了,还能通过编译。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
上面有很多回复,但不够系统我再给整理一下。
有以下几条规则:
1,整型常量分两种:int型和long型
2,long型常量赋值给数值变量时特点是:类型降低必须强转,自动进行类型提升
3,int型常量赋值给数值变量比较特殊:类型降低时先判断常量值是否超出变量类型的表示范围,
      如果没超出自动进行类型转换,超出则要强转,自动进行类型提升
4,int型常量是默认的数值常量,出现的非常频繁,赋值给变量时十分有简化操作的必要,
     因此多了判断范围这一步
5,对于数值变量有六种(byte->short->int->long->float->double),
      变量之间的赋值规则比较统一只要是类型提升的都自动进行,只要是类型降低的都必须强制转换
6,数值常量与数值常量进行运算结果为数值常量,并且在编译优化阶段就已经运算完成得出一个常量结果
     数值常量与数值变量运算的结果是数值变量
     数值变量与数值变量运算的结果为数值变量
7,不进行范围判断的赋值一旦发生超出范围的情况,不进行处理结果为溢出后的值,
     也就是通常正正相加的负
本题的第4行就是int型常量赋值给降低类型的变量的问题,第3行为变量之间赋值规则
第7行为long型变量赋值给long型变量,第8行为int型变量赋值给long型变量自动类型提升
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马