public class dataconvert{
public static void main(String arg[]){
byte b1=67,b2=89;
byte c=(byte)(b1+b2);
System.out.println(c);
}}运行后结果为-100,谁能告诉我,这是为什么呢?原理是什么?
public static void main(String arg[]){
byte b1=67,b2=89;
byte c=(byte)(b1+b2);
System.out.println(c);
}}运行后结果为-100,谁能告诉我,这是为什么呢?原理是什么?
java 中整形数相加默认为int,你的byte c=(byte)(b1+b2); 虽然最后转换成了byte,但超出了byte表示范围,应该写为
byte c=(byte)(b1+b2);
System.out.println((c & 0xff);
这样输出的就是正数,不会是负数 -100。
(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
(b) (byte)b1+b2: 1001 1100
(c) 内存中是保存的是1001 1100,这时需要打印出来(显示的数据和内存中的值不一样),需要进行数据的转换(补码->原码),取反加1,这时变成了1110 0100
(d) 所以 c = -100
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;
}
}