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???
请问哪里错了??谢谢
s的最低的字节fd被放在byte b中,而:
fd 是:1111 1101
一个数的补码是:1111 1101
这个数是多少:-3 (对1111 1101 求反再加1)
答:没有关系. 强制转换就是将低字节强制放入byte b中.只有当程序员想知道它对应的十进制值时,才需要将内部的二进制,通过补码计算出来.计算机内部全是二进制补码形式.
short i = 2;// 00000010
byte b = (byte)i;// 补码:01111101 + 1= 01111110 = 128 + 64 + 32 + 16 + 8 + 4 + 2 = 254
System.out.println(b);
}
}
short i = 2;// 00000010
byte b = (byte)i;// 强制后,b中放的是二进制: 00000010 这个字节 现在要问:b中数据是00000010 这个字节,转换成十进制是什么数值?
即:一个数的二进制被码是:00000010 ,这个数是多少?
由于符号位是0--表示正数,而正数的补码就是其身的二进制(只有负数的补码才要:所有的位求反后再加1),因此:00000010 就表示数2
* @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