byte 的数值范围是 -128~127 ,我做了下测试,看看超过范围会怎么样,结果却得到-125的结果,这结果是怎么算出来的呀,谢谢大家byte a=127,b=4;
byte c= (byte) (a + b);
System.out.print(c);输出结果:
-125

解决方案 »

  1.   

    在(-128~127)范围,溢出后byte会从最小值-128开始存储,在-128的基础上再加上多出的数
      

  2.   

    JAVA中用2进制补码+1来表示负数:1  = 0000 0001 
    ~1 = 1111 1110       //补码
         0000 0001  + (1)
    ---------------------
         1111 1111 = -1 //补码 +1 得到 -1反之,我们可以从-1推出1
    -1  = 1111 1111
    ~-1 = 0000 0000 // -1的补码
          0000 0001 + (1)
    --------------------------
          0000 0001 = 1 // 补码+1 得到 1对比2个相反数的二进制码,可以发现其实是用二进制的高位为1来表示负数的符号,因为最高位如果为1就说明已经超出了(byte)的范围了 1000 0000 = 128(转为十进制是128,但在JAVA已经是-128了)
    (byte)= -128 to 127回到题目:
    0111 1111 = 127
    0000 0100 = 4   +
    ------------------
    1000 0011 = 131 如果按照二进制转换十进制公式: 2^0 + 2^1 + 2^7 =131但在JAVA中,我们知道用高位来表示整型的符号,这是高位是1,所以在JAVA中表示的肯定的不是131
    (我们怎么判断高位呢? 如果是(byte),判断第8位,(short),判断第16位...类推)所以要用取补+1的方法来获得(1000 0011)的正数,后再判断它的负数1000 00110111 1100 //补码
    0000 0001 + (1)
    --------------
    0111 1101 = 125 (2^0 + 2^2 + 2^3 + 2^4 + 2^5 + 2^6) = 125所以我们知道 1000 0011 = -125如果要说规律的话,就象1楼说的那样
    126 127 -128 -127 ..超过127的数,就表示最小的(byte)数
    也就是说
    1111 1111就是一个(byte)最大的负数-1 和 0000 0001 对应 
    ==============================SHORT分割线============================对于一个INT型:
    1 =  0000 0000 0000 0001
    -1 = 1111 1111 1111 1111 最高位为1(红色)就说明它表示的是负数byte a = 127,b = 3;
    short c;
    c = a + b;
    System.out.println(c); //output is 131 (0000 0000 1000 0011) 最高位不是1
    不知道我解释清楚了没