public class Test{
public static void main(String []args){
short s = 0x00fd;
byte b = (byte)s;
System.out.println(b);
}
}
输出为:-3
但是我自己是这样想的:
0x00fd = 15*16 +13 = 253;用二进制表示 为:
0 000000011111101//第一个0表示正数     1 + 4 + 8 + 16 + 32 + 64 + 128 = 253
然后强制转换为byte后,我想应该是如下方式转换的吧,
由于byte只有8位,强制转换后在机器上应该存储为:
1 1111101 = -(1 + 4 + 8 + 16 + 32 + 64 ) = - 125???
请问哪里错了??谢谢

解决方案 »

  1.   

    答:byte b = (byte)s;
    s的最低的字节fd被放在byte b中,而:
    fd 是:1111 1101 
    一个数的补码是:1111 1101 
    这个数是多少:-3  (对1111 1101 求反再加1)
      

  2.   

     byte:   11111101     (低8位)
      

  3.   

    请问强制转换与补码有什么关系??我还是没明白。谢谢。
    答:没有关系. 强制转换就是将低字节强制放入byte b中.只有当程序员想知道它对应的十进制值时,才需要将内部的二进制,通过补码计算出来.计算机内部全是二进制补码形式.
      

  4.   

    那照你这样说下面的代码应该输出 254才对啊??可为什么又是输出2呢 》?public class Test { public static void main(String [] args){
    short i = 2;// 00000010
    byte b = (byte)i;// 补码:01111101 + 1= 01111110 = 128 + 64 + 32 + 16 + 8 + 4 + 2 = 254
    System.out.println(b);
    }
    }
      

  5.   

    答:
    short i = 2;//                00000010
    byte b = (byte)i;//   强制后,b中放的是二进制:  00000010 这个字节  现在要问:b中数据是00000010 这个字节,转换成十进制是什么数值?
    即:一个数的二进制被码是:00000010 ,这个数是多少?
    由于符号位是0--表示正数,而正数的补码就是其身的二进制(只有负数的补码才要:所有的位求反后再加1),因此:00000010 就表示数2
      

  6.   

    public class Test1 { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    short s = 0x00ab;
            byte b = (byte)s;
            System.out.println(b); }}
    输出结果-85
    刚按照楼上的说法算了下,完全和计算的相符
    0x00ab将低字节放入
    ab-->10101011-->取补码11010100-->转换成十进制并且+1,1代表负数-->-85