黑马程序员技术交流社区

标题: 数据类型之间的转换不是很明白 [打印本页]

作者: Pro47x    时间: 2015-9-29 23:39
标题: 数据类型之间的转换不是很明白

课上老是提出的问题:
byte a = 3;
byte b = 4:
byte c = a+b;
byte d =3+4;
编译结果byte c 这句是错误的,既然 a ,b 已经定义过了是byte类型的,为什么a + b不能赋值给byte类型的c 呢,哪位大牛知道,请详细告知,谢谢~
作者: lostyou    时间: 2015-9-29 23:52
a和b是变量,在做加法运算时会提升到int类型,然后int赋值给byte就会出错,但是3+4是编译的时候就可以检测出是否在byte的取值范围的,这里面有个常量优化的概念,在这个范围就可以赋值给d,相当于byte=7;
作者: fcl13761179064    时间: 2015-9-29 23:57
a,b是个变量,及时你定义ab为byte了,但是你参与运算时,short和byte,char都会自动转化为int类型,所以左边是byte类型,右边是int类型,这样类型就不匹配了.那么为什么3+4可以通过呢?因为3+4是常量,他们会先加起来看数值满足byte类型的最大取值范围吗?如果满足,就不会报错.知道了吗?
作者: 窗外的雪儿飞    时间: 2015-9-30 00:19
这个是隐式类型转换,首先a和b都是byte类型,当参与运算的时候,变量会自动类型提升为Int类型,a+b之后就是int类型了,再赋值给byte类型出错,除非强制类型转换。常量相加会先计算之后再判断和是否在byte类型之内,如果不在,则自动类型提升为int类型,如果在byte 类型范围之内则直接赋值。这个是java内置的一个常量优化机制,当你后边学到字符串String的时候还会用到。当然面向对象多态的时候也会涉及相关的问题,只不过那会值引用类型而不是基本类型。好好加油!
作者: outxf003    时间: 2015-9-30 00:55
因为byte运算时会有个自动类型提升,相加的结果为int类型的,想把int类型赋值给byte类型的系统会报错,可以在之前加个byte强转就好了
作者: iverchen    时间: 2015-10-1 12:48
a和b是变量,变量在做运算时会自动提升到int类型, 然后你把int赋值给byte,自然报错了。如果你改成在a和b做完运算了,加上强制转换就可以了,具体如下:
byte c = (byte) (a+b);
这样看就没问题了,a和b先转成int运算,然后再强制转换成byte,再赋值给c
作者: 季995    时间: 2015-10-1 14:11
因为c=a+b  a,b是变量,当a+b的值较大时就会超出byte的范围




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2