后面两个在运算前就把a转换为int了。

解决方案 »

  1.   

    是不是可以这样总结:"byte/short在所有的运算中都进行的是32位运算, 即转换为int型了"?
      

  2.   

    是这样的,他会自动转为int你可以试一下两个byte相加,我记得还是int,很有意思的现象。
      

  3.   

    奇怪?
    难道byte的数 +, -, *, /一个数就转成int,
    byte的数  +=, -=, *=, /=,++,--,....就不转换int 了?
      

  4.   

    DanielYoung(Daniel) 说得对,当用+, -, *, / 时,byte会转变成int型,而当用+=, -=, *=, /=,++,-- 时byte仍然是byte,看来这两种运算符是有区别的,JVM究竟如何实现区别的,为什么要这样做就不得而知了.可能是效率的关系吧,显然后一种比前一种的效率要高.
      

  5.   

    byte b1=127;
             byte b2=++b1;
             System.out.println("`````````````"+b2);//可运行,结果到为-128???如果 byte b2=b1+1;就报这个错了:
    found   : int
    required: byte
             byte b2=b1+1;
                      ^
      

  6.   

    byte b1=127;
             byte b2=++b1;
             System.out.println("`````````````"+b2);//可运行,结果到为-128???
    那这个结果应该越byte的界了,为什么结果变为负的了?
      

  7.   

    但是只有当+, -, *, / 时,byte才会转变成int型呀?
    这不就与 roger2008(痴人说梦) 说的矛盾了吗?
      

  8.   

    kao,上次回复的怎么不见了, 再写一次吧
    大家看看这样认为对不对(我是看java2 编程指南):
    1.byte/short在运算时会进行32位运算即int型,所以a++是对的
    2.a = a + 1;时右边的a是int型的(转换), 但等号左边的仍是byte型, 所以出错;
    3.由于+=运算符, 在其两边数据类型不同时, 会有自动的转型的过程(byte->short->int->long....), 所以a += 1语法没错(这和a = a + 1不同, 这里只是对a的值转型, 并没有对a转型.),现在又有一个疑问:a += 1;后a是什么类型的呢?
      

  9.   

    to jzld0627(丁丁AT EASY^!^)  
    byte b1=127;
             byte b2=++b1;
             System.out.println("`````````````"+b2);//可运行,结果到为-128???
    那这个结果应该越byte的界了,为什么结果变为负的了?---------
    结果变为负的没错啊, 你用二进制算算, 就是这个结果.
      

  10.   

    做几个实验,如下代码:
    int v1 = 9999999999;//10个9
    无法通过编译,原因很简单,内存越界.int v1 = 999999999;//9个9
    int v2 = 9; int v3 = v1*v2;
    可以通过编译,也可以运行,但是结果是错的.也可以理解,现在单个的变量是不会越界了,可是结果越界了,但程序不报错,只是做了个truncate的动作.现在可以理解byte了
    byte v = 127; 执行 v++ 或 v += 1后,程序不会报越界错误,只是做了个truncate,返回-128(可以用二进制换算一下),v依然是byte(否则应该返回128)依然有个令人困惑不解的地方,在做++的时候,JVM是先把v变成int,再转化成byte,还是直接用byte做呢?如果做了转换,++和v=v+1性能上就没有任何区别了,体现不出++的效率,因此,感觉上是不应该做转换的.
      

  11.   

    啊,是这样!
    我认为那从这个结果
           byte ba=-128;
             ba-=-256;//从表面看-256和ba都超出了byte的范围
             System.out.println("`````````````"+ba);//值为-128
             byte bb1=ba;//证明ba还是byte型
    可看出+=, -=, *=, /=,++,-- 等操作时,最终ba还是byte型,只是过程中忽略了int型,按byte范围处理!
    (通过实践看出的,不知这种理解对不对)
      

  12.   

    roger2008(痴人说梦)说的也很明白了,楼主结贴吧,能不能多给点分呀?!