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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 潘廖明 中级黑马   /  2013-5-21 13:43  /  1895 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class MyClass
{
        public static void main(String argv[])
        {
                byte b = 3;

                b = 3 + 124;//毕老师说这样子赋值有问题,为什么现在这样子赋值没问题?非一定要等到超过127他才检查出这里类型不匹配?加号不是自动给它转换为intl类型了?
               

               
        }
}

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 赞一个!

查看全部评分

11 个回复

倒序浏览
byte 是128字节吧 ,不知道 ,关注
回复 使用道具 举报
你都说了转为了int了。然后int给byte可能损失精度。
回复 使用道具 举报
毕老师说的是b= b+124;这样是有问i题的,因为b是byte类型的,而124是int类型的,所以在运算时会将b提升为Int型的,最后导致丢失精度;
而b= 3+124;这时如果没有超过byte的范围,也就是-128~127,这时会自动进行类型转换的。如果超过了byte的范围,就必须进行显式转化,b=(byte)(3+124),这时存储的是127对256取模后的值。
回复 使用道具 举报
lpflpy 发表于 2013-5-21 14:06
毕老师说的是b= b+124;这样是有问i题的,因为b是byte类型的,而124是int类型的,所以在运算时会将b提升为In ...

{:soso_e179:}
回复 使用道具 举报
编译的时候看的是语法错误。
运行的时候才会看值得越界问题


比如:
int []arr = new int[]{1};
System.out.println(arr[3]); //这里编译的时候不会出现问题,

但是运行的时候就会出现角标越界异常
回复 使用道具 举报
不好意思。刚忘记正面回答你的问题了:

byte b = 3; //这里其实也涉及到了转换,3默认是int型的,自动转换为了byte类型的

b = 3 + 124; //当然这里 3 和124 都是常量(默认是int类型的),进行运算后没有超过一个字节,可定也是可以自动转换的;

但是如果是这样的:
b = b + 124; //这样就会出现问题了,124是默认是int型的4个字节。b是byte型的,两个字节
                    这样两个类型的数据进行运算后就会转换成int类型的。这个时候你将4个字节的数据赋给2个字节的类型。语法上就会出现异常,发生精度损失异常
回复 使用道具 举报
Super_Class 发表于 2013-5-21 15:21
不好意思。刚忘记正面回答你的问题了:

byte b = 3; //这里其实也涉及到了转换,3默认是int型的,自动转 ...

先说下byte是一个字节,要是我这样子弄
byte b=3;
b=(int)b+124;//不是通过编译的
b=3+124;//是能够通过编译的
出现上面的现象,求原因?
回复 使用道具 举报
Super_Class 发表于 2013-5-21 15:15
编译的时候看的是语法错误。
运行的时候才会看值得越界问题

byte b=3;
b=b+4;//也是不能够通过编译的,还没到运行的时候啊!是不是编译的时候,他看到b的具体值,所以检查不出值是否在-128-127之间?
回复 使用道具 举报
潘廖明 发表于 2013-5-21 16:57
先说下byte是一个字节,要是我这样子弄
byte b=3;
b=(int)b+124;//不是通过编译的

byte b=3;
b=(int)b+124;//不是通过编译的   //这句话本来就是一个问题,
124默认是int类型的。b+124会自动转成int类型的。就算你不写(int) 强转,它也是int类型的

你应该这样写
b = (byte) b + 124;  //这样才将int类型的强转为byte 类型的


b=3+124;//是能够通过编译的
回复 使用道具 举报
潘廖明 发表于 2013-5-21 17:03
byte b=3;
b=b+4;//也是不能够通过编译的,还没到运行的时候啊!是不是编译的时候,他看到b的具体值,所 ...

编译的时候是看语法的:

它也不知道你是否真的超过一个字节。但是你将int类型的赋给byte类型的就有可能损失精度。

所以你编译时不通过的
回复 使用道具 举报
还没弄出来吗?你看个高级点的问题吧,希望你能找到答案
http://bbs.itheima.com/thread-47851-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马