黑马程序员技术交流社区

标题: 隐式类型转换 [打印本页]

作者: 苏小惠    时间: 2014-1-3 22:19
标题: 隐式类型转换
本帖最后由 苏小惠 于 2014-2-24 18:55 编辑

class Demo
{
        public static void main(String[] args){
                int x = 4;
                x = x +4;//编译通过
                byte b = 5;
                b = b+5;//编译报错,为啥?跟上面有啥不一样
               
        }
}


作者: Class_焱    时间: 2014-1-3 22:32
本帖最后由 Class_焱 于 2014-1-3 22:33 编辑

               
                解释:
                        b = b+5在参与运算的时候,首先会自动转换成int类型。
                        在这个时候,b+5其实都被提升了类型。
                        所以,他们的计算结果也应该是int类型。
                        最终,就相当于直接把int类型赋值给byte类型,所以,会有精度的损失。

                        如果参与运算的是常量,编译器会先计算值,在看该值是否是左边能够表示的范围。
                        如果是,就不报错。l
作者: @翱翔@    时间: 2014-1-3 22:34
class Demo
{
        public static void main(String[] args){
                int x = 4;
                x = x +4;//这是两个int类型的数相加 ,因为x是你定义的int类型,而4在运算中会自动转换成int类型;所以不会报错
                byte b = 5;
                b = b+5;//这个b是byte类型而5在运算中会自动转换成int所以会报错//隐式转换(从小到大)                        //在运算中byte,short,char会自动转换成  int    long ,float 会自动转换成 double
               
        }
}



作者: Class_焱    时间: 2014-1-3 22:34
正解:b =(byte)(b+5)    解释 :强制转换
作者: 其LovE斤    时间: 2014-1-3 22:44
你是我今天碰到的第三个这个问题了。
建议去看一下  李若亮  老师的12月14号哪天的公开课视频。
int x = 4;
x = x +4;
JVM(编译器)看到整数,它就默认它是int型的。你这里x是int   4是int  肯定没问题

byte b = 5;  (注意,这里5是常量)
先说这个。JVM在进行定义的变量初始化时,首先检测右侧的常量的数据自身的数据类型,与左侧的数据类型之间是否存在有可转化的可能性,这里 int 和 byte 有转换的可能性。然后检测右侧的数据是不是在左侧类型的范围内。byte是(-128~127),这里5在范围内。如果在范围内,自动将左侧的数据转型成左侧的类型
b = b+5;(这里b是变量)
b在这里是变量,是byte类型的变量,1是int型的。编译器将b提升为int型的。然后和1相加 (b+5)
但是“=”右边是变量的情况下,变量代表的是一片内存空间,无法判断是否在byte
范围内。int在内存中占4个字节,byte是占1个字节,左边放不下,错误,报的是  数据精度丢失。

一句话说完:
主要看右边,右边是常量,才会去看范围,范围达到,通过
                  右边是变量,看类型相同不,   不相同, 失败


作者: 李兴    时间: 2014-1-3 23:04
byte b = 5;
b = b+5;
编译失败,因为b为byte类型,5为int类型,运算时会将byte(计算机中1个字节)转化为数值表示范围更大的int类型(4个字节),将int类型的再赋值给byte就会报类型不匹配错误,要修改可以将5强制转化为byte类型,如下
byte b = 5;
b = (byte)b+5;
作者: 悠然的我    时间: 2014-1-3 23:21
楼上的兄弟们说的都很清楚了,主要在于你右边无论怎么加,算出来的结果最小就是int类型的
byte b = 5;
byte a=4;
b = b+a;  //这么搞都是错误,何况你加一个数据类型不明确的5呢。




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