Byte:一个字节,标记为byte 0
Word:二个字节,从byte 0到byte 1
Long : 四个字节,从byte 0到byte 3
每个byte由8个位(bit)组成,从bit 7 到 bit 0 (从左往右)。
每个word由16个 bit 组成,从bit 15 到 bit 0 (从左往右)。
每个long由32个 bit 组成,从bit 31 到 bit 0 (从左往右)。
通常来说左边是高位,右边是低位。
long length = 4294967294L;
char hexDigits[] = { '0', '1', '2', '3', '4',
'5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F' };
//从输出结果可以看出,long的存储结果是高位放在左边低位放在右边
char[] longToChars(long length) {//这个函数只取long的右32位,即从左往右数的第32位一直读到最后
int start =32;
int position;
char[] chars = new char[8];
System.out.println("parameter:"+length);
for(int i=0;i<8;i++){
position =(int)((length>>> ( start-(i+1)*4 ) )& 0x000000000000000f);
chars[i]=hexDigits[position];
} System.out.println(new String(chars));//输出的顺序也是从坐往右,依次输出byte对应的16进制字符
return chars;
}
longToChars(4294967294L);//输出结果FFFFFFFE
longToChars(65535L);//输出结果0000FFFF
longToChars(31L);//输出结果0000001F
最近一个项目中c/c++代码和java代码通信,c那边用的是UINT类型,穿过来时4个字节,在这边java要把这4个字节转换成数值。这里就出现了一个java和c数值类型存储顺序不同的问题了。
从微观上来看,也就是从单个byte来看,在c中和在java中存放的顺序是一样的,例如31在c中表示为0x1F(从左往右输出表示),在java中也是如此。但是如果从宏观,也就是每个byte之间的顺序,java和c就大不一样了。从宏观来说java也是高高低低,高位放左边低位放右边,但是c中刚好相反。
如果在c中,31L的16进制从左往右输出结果是1F00000000000000,java中是000000000000001F。