黑马程序员技术交流社区

标题: 与数据类型有关的编译失败,求高手讨论~~~ [打印本页]

作者: wahaha    时间: 2013-2-27 20:36
标题: 与数据类型有关的编译失败,求高手讨论~~~
本帖最后由 夏添 于 2013-2-28 19:55 编辑

     详见下面代码
byte a = 1;
byte b = 2;
byte c = a+b;
这段代码编译是不通过的,我找到了两种解释

1.来自于张孝祥教程的解释:所有位数低于int型的数运算结果都会自动提升为int型  ,
    所以a + b的结果不能赋值给 byte型的 c ;(个人理解,这么做可能是方便java的运算)

2.来自朋友的解释,java在编译阶段,a和b都没有赋值,  a+b的值可能超出byte范围,存在隐患,于是java虚拟机就让这段代码挂掉.(这java也太智能了吧..真替程序员着想..)\

朋友们,你们觉得到底是什么原因呢???
作者: 李挺    时间: 2013-2-27 20:45
Java定义的自动提升规则:
1. 所有byte型、short型和char型将被提升到int型。
2. 整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。
作者: 陈圳    时间: 2013-2-27 20:49
程序在编译时只检查语法有没有错误,在运行时才检查程序.所以2不成立.
作者: wahaha    时间: 2013-2-27 21:08
求盆友进来说说编译失败的原因~~~
作者: 孙宁    时间: 2013-2-27 22:04
javac 仅负责编译,在编译byte c = a+b时,会默认a+b是int型的数据,将int型数据赋值给byte型的数据c时会丢失精度.
作者: Benwolf0818    时间: 2013-2-27 22:15
byte与byte数据相加,数据自动转换为int型,所以c=a+b肯定不对了啊。需要强制类型转换,byte c = (byte)(a+b)
作者: 刘国涛    时间: 2013-2-27 22:32
我认为是第一种原因,上面的几位也都说了,我觉得正是因为a+b的值可能超出byte范围,所以java才会定义自动提升规则,把位数低于int型的数运算结果都会自动提升为int型 。
作者: 谢洋    时间: 2013-2-28 01:28
本帖最后由 谢洋 于 2013-2-28 01:32 编辑

拿到机上测了下,发现以下问题;
  byte a = 1;     //编译器检测一下int结果有没有越界,没有
  byte a1 = 134;  //报错:这里就表明编译器检测出int越界了
  byte b = 2;
  byte c = 1+126; //不报错
  byte c = 1+127; //报错:表明编译器在两int型相加时,还检测结果是否大于byte的最大值
  byte c = a + 1; //报错:表明编译器看到有int型与a相加时,但编译忘记了a是多少了,都不知a是多少那就没法运算了,直接报错
  
  //报错:编译器a +b 运算时,他却突然忘a b 的值是多少(张老说过编译器是一行一行检查的,但还是能记住a b 什么类型),没法检查运算结是否越界;
  //只好报错
  byte c = a + b;
  byte d = (byte)(a+b);//强转的,一定行,不查了
  //这个阶段虚拟机,应不会参与进来的,反正觉得它参与了不合常理

但是:编译没说它忘了a b 是多少,而是报int不能转为byte
Multiple markers at this line
- Duplicate local variable c
- Type mismatch: cannot convert from int to byte

求版主给点辛苦分啊!
作者: wahaha    时间: 2013-2-28 08:34
谢洋 发表于 2013-2-28 01:28
拿到机上测了下,发现以下问题;
  byte a = 1;     //编译器检测一下int结果有没有越界,没有
  byte a1  ...

哥们,辛苦了...你用心了

你说的介些,俺们都晓得...俺也实验了N次
你木有说byte c  =  a + b ;编译不通过到底是因为啥...请表态哈...
请盆友们来点猛料,,力求简洁.
作者: wahaha    时间: 2013-2-28 08:34
哥们,辛苦了...你用心了

你说的介些,俺们都晓得...俺也实验了N次
你木有说byte c  =  a + b ;编译不通过到底是因为啥...请表态哈...
请盆友们来点猛料,,力求简洁.
作者: 谢洋    时间: 2013-2-28 10:09
夏添 发表于 2013-2-28 08:34
哥们,辛苦了...你用心了

你说的介些,俺们都晓得...俺也实验了N次

我语文学得不好,表达不行啊!
先明确一点,编译器是一行行的检查有没有错的,所以说它忘了之前做过的事(这是张老师说的,不是我说,错了不关我的事)。
当编译器检查到byte c = a + b;
1,先做的是转为int型再相加;
2,然后试图检测这两变量运算结果是否大于127,但这时编译器根本不知道变量a b 的值多少;
3,既然都没知到a b 值是多少,肯定检测不出 a b 相加的结查是否大于127;
4,这时候编译器是选择报错还是不报错?很明显它选择了报错:哥们这代码结果我算不出来,你写的,你自己看着办吧
5,疑问?编译器知道变量a b 的地址?如果知道,为什么不根据地址把a b 的结果取出来看一下不就完了?
作者: wahaha    时间: 2013-2-28 13:04
谢洋 发表于 2013-2-28 10:09
我语文学得不好,表达不行啊!
先明确一点,编译器是一行行的检查有没有错的,所以说它忘了之前做过的事( ...

木有疑问,我是想问,关于编译不通过的原因,哥们是同意我的第二条咯~~~呵呵~~~




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