黑马程序员技术交流社区

标题: 关于类型转换问题 [打印本页]

作者: yangchao8907    时间: 2013-7-30 12:06
标题: 关于类型转换问题
本帖最后由 杨兴庭 于 2013-7-30 18:17 编辑

byte b = 1 + 1;为什么可以编译通过?这里面1不是int类型么?
作者: 手心里的温柔    时间: 2013-7-30 12:23
byte b = 1+1;其实就相当于byte b = 2; 已经做了强制类型转换 故编译能通过


希望能帮到你
作者: yangchao8907    时间: 2013-7-30 12:26
我又想明白了,因为byte取值范围是-128至127,1+1在其取值范围内,不损失精度,它会自动完成强制转换动作,所以可以进行运算。对么?
作者: 清心玉质    时间: 2013-7-30 12:56
对基本数据类型执行算数运算时,只要类型比int小,那么在运算前这些值会自动转换成int,最终生成的结果就是int。
当一个int型字面量的值被赋给一个byte 或short型的变量时,如果字面量的值没有超过对应类型的范围时,就不会产生错误。1+1没超过byte精度,所以编译器自动完成类型转换。
作者: Mr_Free    时间: 2013-7-30 15:05
本帖最后由 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)。



作者: 芦青    时间: 2013-7-30 21:37
因为1是常量,是可以被固定的值,只要它们相加的结果在byte的取值范围内,就没有错误……




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