黑马程序员技术交流社区
标题:
byte,short,int,long的常量,变量运算是的类型转换
[打印本页]
作者:
面具猴
时间:
2013-11-18 21:06
标题:
byte,short,int,long的常量,变量运算是的类型转换
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行不需要进行强转
作者:
默狼
时间:
2013-11-18 21:19
a1和a2都是byte型的,相加的结果页是byte型的,所以不需要强转。低级别的数据类型在计算时会自动向级别类型的数据转换。这个是隐形转换。 byte- >short-> int->long->float->double 进行运算时两边的数据类型都是一致的,所以不需要强转换。
作者:
hurryup
时间:
2013-11-18 21:32
1.对于常量,byte类型相加不超过数据表达范围,都是可以的,对于变量相加,是不可以的,因为不确定在运行时会报丢失精度的错误。
2.至于long类型,是可以的,因它大于int类型的数据表达范围,不会再运行时报错。
作者:
侠客梦的懒猫
时间:
2013-11-18 22:44
低精度的可以向高精度的自动转换,高精度向低精度时需要强制转换。
同时赋值运算也有两种 :
#1,当等号右边全是 常数时,只需判断运算结果是否越界,如果越界,则编译不能通过,
如果没有越界,则直接赋值,不需要强制转换。
#2,当等号右边有变量参与运算时,其中的byte,short 会先转换成int,在参与运算
作者:
侠客梦的懒猫
时间:
2013-11-18 22:44
低精度的可以向高精度的自动转换,高精度向低精度时需要强制转换。
同时赋值运算也有两种 :
#1,当等号右边全是 常数时,只需判断运算结果是否越界,如果越界,则编译不能通过,
如果没有越界,则直接赋值,不需要强制转换。
#2,当等号右边有变量参与运算时,其中的byte,short 会先转换成int,在参与运算
作者:
张天昊76
时间:
2013-11-18 23:35
解释一下为什么byte a4 = 3 + 4;不需要强制转换:
是因为在赋值运算时,右边如果有变量参与,那么结果最低都是int类型。如果右边没有变量参与,只要右边式子的值在这个类型的数值范围内就可以通过编译。byte的范围是-128~127.显然在这个范围内。
在解释一下long b3=b1+b2;为什么没有强制转换:
在对变量b1和b2进行赋值的时候就有隐示类型转换,都转为long型了,相加的结果也是long型,做运算的时候就没有类型转换了,还能通过编译。
作者:
面具猴
时间:
2013-11-20 00:14
上面有很多回复,但不够系统我再给整理一下。
有以下几条规则:
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型变量自动类型提升
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2