计算机数据的存储和计算机数据的识别有着一整套的机制。当然了关于计算机中补码和反码一定要有意识。这个知识点主要是在自己编写函数的过程中意识到的。我写的第一个函数如下:
public byte[] int2ByteArr(int i) {
// TODO Auto-generated method stub
byte [] bytes=new byte[4];
bytes[0]=(byte)i;
bytes[1]=(byte)(i>>8);
bytes[2]=(byte)(i>>16);
bytes[3]=(byte)(i>>24);
return bytes;
}
这个函数主要是把此一个由四个字节存储的数据,分别按照字节存储。我们知道如果一个整数强转成字节,只会剩下最后一个字节。所以很容易获得这个整数的四个字节的存储值。把一个数据26360,这个字节为0000 0000 0000 0000 0110 01110 1111 1000 四个字节。如果分别存储的话,那么最后一个字节存储的就不再是1111 1000了,而是存储成了10001000,所以,你再取出这个值,就是-8,而不是一个整数。
public int byteArr2Int2(byte[] bytes) {
//把byte强制转换成int类型,此种情况非常无线
int length=(int)bytes[0]+256*(int)bytes[1]+65536*(int)bytes[2]+16777216*(int)bytes[3];
int i0=bytes[3]<<24;
int i1=(bytes[2] & 0xff)<<16;
int i2=(bytes[1] & 0xff)<<8;
int i3=(bytes[0] & 0xff);
//return i0 | i1| i2 | i3;
return length;
}
这个的length直接取出来的是10001000,而强转成int类型的话,就变成了-8,而不再是10001000。如果采用各位“或”的形式,就可以避免这种情况,不再牵涉到补码的存储问题。