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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangchao8907 中级黑马   /  2013-7-30 12:06  /  1174 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-7-30 18:17 编辑

byte b = 1 + 1;为什么可以编译通过?这里面1不是int类型么?

评分

参与人数 1黑马币 +3 收起 理由
杨兴庭 + 3 赞一个!

查看全部评分

5 个回复

倒序浏览
byte b = 1+1;其实就相当于byte b = 2; 已经做了强制类型转换 故编译能通过


希望能帮到你

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
我又想明白了,因为byte取值范围是-128至127,1+1在其取值范围内,不损失精度,它会自动完成强制转换动作,所以可以进行运算。对么?
回复 使用道具 举报
对基本数据类型执行算数运算时,只要类型比int小,那么在运算前这些值会自动转换成int,最终生成的结果就是int。
当一个int型字面量的值被赋给一个byte 或short型的变量时,如果字面量的值没有超过对应类型的范围时,就不会产生错误。1+1没超过byte精度,所以编译器自动完成类型转换。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 Mr_Free 于 2013-7-30 15:38 编辑

分析:数据类型转换:分为自动类型转换和强制类型转换自动类型转换就是,jvm内部自动将数据类型进行转换,它是让Java编译器自动进行转型操作强制转型不用什么条件,只要我们在前面加上()就可以了。比如
*数据类型的转换优先级是:double>float>long>int>byte,short,char

*赋值运算分为2种:
*1,等号右边全是由常量和运算符组成的表达式:因为都是常量,所以虚拟机在编译期就能知道表达式的结果,
*并判断结果是否在被赋值的变量的类型范围内,如果在则直接赋值,如果不在则需要强制转换。
*2,等号右边有变量参与运算:如果参与运算的变量是byte、short、char,它们会先转变为int类型,再参与运算,类型总是会提升。
byte b = 1 + 1;//1+1=2,你这里是优先级高的int类型转换为优先级低的byte类型,因为等号右边是都是常量,所以虚拟机在编译期就能知道要表达式的结果,判断结果是否在被赋值的变量类型范围内,2是在8位二进制也就是-128到127范围内的,如果超出范围,就会报异常了。你需要在等号右边加上(byte)。


评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
芦青 来自手机 中级黑马 2013-7-30 21:37:53
地板
因为1是常量,是可以被固定的值,只要它们相加的结果在byte的取值范围内,就没有错误……
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马