黑马程序员技术交流社区

标题: 关于基础视频中的一个问题 [打印本页]

作者: 王小五-fight    时间: 2013-4-10 23:59
标题: 关于基础视频中的一个问题
本帖最后由 王小五-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同样是变量,不也会出现超出范围的情况,为什么就可以编译通过?

作者: 小菜凉碟    时间: 2013-4-11 00:07
额。。。表示int型没试过,见识了,占个沙发,求高人指教
作者: 通行天下    时间: 2013-4-11 00:13
  1.   byte a=5;
  2.   byte a1=6;
  3. byte a2=7;
  4. a=a1+a2;  这里因为6与7都是int,所以他们的和也一定是int,然而将一个int型的数赋给byte型的变量当让会损失精度啊!又因为int型的最大值为40多亿,所以一般第二种情况是不会越界的。
复制代码

作者: Asan    时间: 2013-4-11 00:15
byte的内存空间是八位!取值范围是-128~+127
作者: 小菜凉碟    时间: 2013-4-11 00:17
补充一下,貌似整数运算默认的是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类型,所以不会损失精度,希望能帮到你

作者: 陈宇鹏    时间: 2013-4-11 00:17
byte的范围是-128~127
int的范围是在-32768~32767之间
也就是因为范围不同的原因。
作者: 王大斌    时间: 2013-4-11 00:19
可能损失精度。不能将一个大类型的数据给小类型,就像   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不存在此类问题
作者: 孙百鑫    时间: 2013-4-11 00:33
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);
        }
}
作者: 杨闯    时间: 2013-4-11 00:43
楼上 小菜凉碟 正解。第八行加个强制转换就好了  a = byte(a1 + a2);
作者: 黄玉昆    时间: 2013-4-11 08:55
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
作者: 王小五-fight    时间: 2013-4-11 09:54
多谢各位啦。
作者: 王小五-fight    时间: 2013-4-11 10:09
黄玉昆 发表于 2013-4-11 08:55
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢 ...

版主辛苦了:)




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