byte b1 = 67;
byte b2 = 89;
byte b3 = (byte)(b1 + b2);b1 + b2 的结果是156,已经超出了byte类型的范围
我知道由int转换为byte时会有一个“截”的过程,但不明白这个过程是怎么进行的;
还有,为什么b3最后的值为-100?
菜鸟求救,请高手指点!

解决方案 »

  1.   

    看看我的这篇blog吧:Int型和byte数组,以及long型和byte数组之间的相互转换
      

  2.   

    int是32位,而byte是8位的。 所以由int转向byte ,高位被截掉了24位。 (也就是前面的24位会被截掉)
      

  3.   

    至于后面的-100是怎么来的。
    是因为结果156,已经超出了byte类型的范围 ,128时溢出为-128,156时显然就是-100了。 
      

  4.   

    byte类型的取值范围-128到127,当其值超出范围时循环取值。
    也就是说当128时,其值应该为-128。
    它们之间的差值为-256,显然156的值为-100.
      

  5.   

    byte 8bit
    it   32bit直接加的时候不时按照int 32 bit来计算的!
      

  6.   

    Request:byte占一个字节,8位。byte类型的取值范围-128到127你可以把这个范围看做是一个头尾相连的环,如果超过这个范围,那么就"循环到头,继续取值",156比127大29,超过最大表示范围29个,这个时候,循环到最小范围-128,此时28就是-128了,0就是-100,即-156被转换为-100。P.S 如果给byte赋值的数在-128-127之间,那么可以直接赋值,否则必须进行强制转换,否则出错byte,short,char之间不会互相转换,三者在计算时先会转换为int类型char类型数据和byte,short,int或long运算的结果总是int类型数据
      

  7.   

    高位被截掉了24位。 (也就是前面的24位会被截掉) ?哪本书上这样写的?我没见过... JAVA要这样处理的话,你不觉得太暴力了点吧,呵呵01010110 是8656 是0111000这里是所能表示的数据范围,不能直接‘截掉’哦
      

  8.   

    终于完全搞明白了:
    用补码表示:
    (67)10 = (0000000000000000000000001000011)2
    (89)10 = (0000000000000000000000001011001)2两者相加,得:(0000000000000000000000010011100)2
    由于已经超出了byte的范围,截去前面24位,得:(10011100)2将其转化为原码:【10011100】补
                  = -(【0011100】反 + 1)
                  = -(1100011 + 1)
                  = -1100100转化为十进制即为-100