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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王小五-fight 中级黑马   /  2013-4-10 23:59  /  1638 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王小五-fight 于 2013-4-11 09:54 编辑

class Zhuanhuan//关于强制转换的调试,字节类型
{
      public static void main(String[]args)
       {
              byte a=5;
              byte a1=6;
              byte a2=7;
              a=a1+a2;
              System.out.println(a);
       }
}
编译之后出现问题:


老师的解释是:首先要明白第一条赋值语句的含义,等号右边的常量为int类型和等号左边的类型不匹配,那么会先进行判读看右边是否超过范围,没有超过就会自动将int类型的值得低8bit赋给左边。
其次,a=a1+a2这条赋值语句,因为a1和a2是变量,那么无法确定两个变量的和是否超过a类型的范围,如果超过就会出现精度损失。例如,a1可以是6,也有可能是127,那么就超过了范围。
这个表示看懂了,但是下边整数的例子有点不太懂。
class Zhuanhuan_int//关于强制转换的调试,整数类型
{
       public static void main(String[]args)
       {
              int a=5;
              int a1=6;
              int a2=7;
              a=a1+a2;
              System.out.println(a);
       }
}
这里就可以直接编译通过,这里的第一条语句不存在转换的问题。但是我的疑惑是:对于a=a1+a2这条赋值语句,a1和a2同样是变量,不也会出现超出范围的情况,为什么就可以编译通过?

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1 赞一个!

查看全部评分

11 个回复

倒序浏览
额。。。表示int型没试过,见识了,占个沙发,求高人指教
回复 使用道具 举报
  1.   byte a=5;
  2.   byte a1=6;
  3. byte a2=7;
  4. a=a1+a2;  这里因为6与7都是int,所以他们的和也一定是int,然而将一个int型的数赋给byte型的变量当让会损失精度啊!又因为int型的最大值为40多亿,所以一般第二种情况是不会越界的。
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
byte的内存空间是八位!取值范围是-128~+127
回复 使用道具 举报
补充一下,貌似整数运算默认的是int类型,如果不是会自动提升为int类型
byte a = 5;
byte a1 = 6;               
byte a2 = 7;
a = a1 + a2;
你说的a1和a2是变量没错,运算时可能超出byte范围损失精度,同时a1和a2在算数运算时会自动提升为int类型,这时a1 + a2值为nt类型,而
a还为byte类型,所以编译时会报错
当a、a1、a2全为int类型参与算数运算时,因为算数运算本就默认为int类型,所以不会损失精度,希望能帮到你

评分

参与人数 2技术分 +2 收起 理由
张熙韬 + 1 赞一个!
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
byte的范围是-128~127
int的范围是在-32768~32767之间
也就是因为范围不同的原因。
回复 使用道具 举报
可能损失精度。不能将一个大类型的数据给小类型,就像   float f = 10.3;error   这是由于10.3默认是double

你这个byte+byte  = int 类型,当你int类型给byte的时候,就可能损失精度,java编译器要强制检查这种问题。必须使用byte强转


           byte a1=6;
           byte a2=7;
           
            byte a3 = (byte)(a1+a2);
这样就不会报错了。



你问的两个问题其实不是同一类型的问题
‘下边的int不存在此类问题

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
class Demo//关于强制转换的调试,整数类型
{
        public static void main(String[]args)
        {        
                byte a=5
                byte a1=6;
                byte a2=7;
                a=(byte)(a1+a2);;//正确的应该是这样的
//错误是在这里.为什么会损失精度呢?因为在a1+a2的时候类型自动提升为了int类型,
//所以int类型给byte类型的时候会损失精度(也就是老毕说4两的饭装2两的碗装不下<我居然饿了!!!!!>),这里需要强制转换成byte类型就ok啦.

               System.out.println(a);
        }
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
杨闯 中级黑马 2013-4-11 00:43:07
9#
楼上 小菜凉碟 正解。第八行加个强制转换就好了  a = byte(a1 + a2);
回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
多谢各位啦。
回复 使用道具 举报
黄玉昆 发表于 2013-4-11 08:55
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢 ...

版主辛苦了:)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马