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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


课上老是提出的问题:
byte a = 3;
byte b = 4:
byte c = a+b;
byte d =3+4;
编译结果byte c 这句是错误的,既然 a ,b 已经定义过了是byte类型的,为什么a + b不能赋值给byte类型的c 呢,哪位大牛知道,请详细告知,谢谢~

6 个回复

倒序浏览
a和b是变量,在做加法运算时会提升到int类型,然后int赋值给byte就会出错,但是3+4是编译的时候就可以检测出是否在byte的取值范围的,这里面有个常量优化的概念,在这个范围就可以赋值给d,相当于byte=7;
回复 使用道具 举报
a,b是个变量,及时你定义ab为byte了,但是你参与运算时,short和byte,char都会自动转化为int类型,所以左边是byte类型,右边是int类型,这样类型就不匹配了.那么为什么3+4可以通过呢?因为3+4是常量,他们会先加起来看数值满足byte类型的最大取值范围吗?如果满足,就不会报错.知道了吗?
回复 使用道具 举报
这个是隐式类型转换,首先a和b都是byte类型,当参与运算的时候,变量会自动类型提升为Int类型,a+b之后就是int类型了,再赋值给byte类型出错,除非强制类型转换。常量相加会先计算之后再判断和是否在byte类型之内,如果不在,则自动类型提升为int类型,如果在byte 类型范围之内则直接赋值。这个是java内置的一个常量优化机制,当你后边学到字符串String的时候还会用到。当然面向对象多态的时候也会涉及相关的问题,只不过那会值引用类型而不是基本类型。好好加油!
回复 使用道具 举报
因为byte运算时会有个自动类型提升,相加的结果为int类型的,想把int类型赋值给byte类型的系统会报错,可以在之前加个byte强转就好了
回复 使用道具 举报
a和b是变量,变量在做运算时会自动提升到int类型, 然后你把int赋值给byte,自然报错了。如果你改成在a和b做完运算了,加上强制转换就可以了,具体如下:
byte c = (byte) (a+b);
这样看就没问题了,a和b先转成int运算,然后再强制转换成byte,再赋值给c
回复 使用道具 举报
季995 中级黑马 2015-10-1 14:11:29
7#
因为c=a+b  a,b是变量,当a+b的值较大时就会超出byte的范围
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马