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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 苏小惠 中级黑马   /  2014-1-3 22:19  /  1512 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 苏小惠 于 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;//编译报错,为啥?跟上面有啥不一样
               
        }
}

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 Class_焱 于 2014-1-3 22:33 编辑

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

                        如果参与运算的是常量,编译器会先计算值,在看该值是否是左边能够表示的范围。
                        如果是,就不报错。l

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
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
               
        }
}


评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
正解:b =(byte)(b+5)    解释 :强制转换
回复 使用道具 举报
你是我今天碰到的第三个这个问题了。
建议去看一下  李若亮  老师的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个字节,左边放不下,错误,报的是  数据精度丢失。

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

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
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;

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
楼上的兄弟们说的都很清楚了,主要在于你右边无论怎么加,算出来的结果最小就是int类型的
byte b = 5;
byte a=4;
b = b+a;  //这么搞都是错误,何况你加一个数据类型不明确的5呢。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马