public class dataconvert{
public static void main(String arg[]){
byte b1=67,b2=89;
byte c=(byte)(b1+b2);
System.out.println(c);
}}运行后结果为-100,谁能告诉我,这是为什么呢?原理是什么?

解决方案 »

  1.   

    byte 型的范围是 -128 到 127
    java 中整形数相加默认为int,你的byte c=(byte)(b1+b2); 虽然最后转换成了byte,但超出了byte表示范围,应该写为
    byte c=(byte)(b1+b2);
    System.out.println((c & 0xff);  
    这样输出的就是正数,不会是负数 -100。
      

  2.   

    b1 + b2  = 156而156的二进制表示为:00000000000000000000000010011100
    (156)10  = (00000000000000000000000010011100)2 二进制 32位int型负100的二进制表示为:11111111111111111111111110011100
    (-100)10 = (11111111111111111111111110011100)2 二进制 32位int型
    将这个转换成byte型就只剩下了8位:10011100byte 只有8个2进制位,当左边第一位为1时表示负数,于是
    8位的byte型二进制数:                        10011100
    32位的int型二进制数:11111111111111111111111110011100
    他们两个是相等的,即表示的值都是-100
      

  3.   

    (a)   b1+b2: 0000 0000 1001 1100
    (b)  (byte)b1+b2: 1001 1100
    (c)   内存中是保存的是1001 1100,这时需要打印出来(显示的数据和内存中的值不一样),需要进行数据的转换(补码->原码),取反加1,这时变成了1110 0100
    (d)  所以  c = -100
      

  4.   

    public static byte[] marshallInt(int num) {//marshall int
    byte[] byteStream = new byte[4];
    for (int i = 0; i < 4; i++) {
    byteStream[i] = (byte) (num >>> (24 - i * 8));
    }
    return byteStream;
    } public static int unmarshallInt(byte[] byteStream) {//unmarshall int
    int mask = 0xff;
    int temp = 0;
    int res = 0;
    try {
    for (int i = 0; i < 4; i++) {
    res <<= 8;
    temp = byteStream[i] & mask;
    res |= temp;
    }
    return res;
    } catch (Exception e) {
    return 0;
    }
    }