数据类型:
1、char: 一个字节,8位二进制、2位16进制0x00-0xFF,十进制:0-255(unsigned) 或 -128-127(signed)
2、short:二个字节,16位二进制、4位16进制0x0000-0xFFFF ,十进制:0-65535(unsigned) 或-32768-32767(signed)
3、long:四个字节,32位二进制、8位16进制 ,十进制:以此类推。
4、double:八个字节,64位二进制、16位16进制, 十进制:可能有点特别,没研究。
有无符号:
无符号:所有二进制位都表示数字,原码计算数字大小。 例:1111 0000——128+64+32+16 = 240
有符号: 第一位表示符号,其余二进制位表示数字,计算值:正数原码计算,负数:-(补码=反码+1)。例:1111 0000[原码]—— -(0000 1111[反码] + 1)[补码]= -0001 0000 = -16
位操作:
两个char(short)类型单(双)字节的二进制值 合成short(long)类型双(四)字节二进制值:
char valueLo, valueHi; short value = valueHi<<8 | valueLo & 0xFF;
short valueLo, valueHi; long value = valueHi<<16 | valueLo & 0xFFFF;
特别注意:当两个8位/16位二进制转成16位/32位二进制时,首先每一个8位/16位二进制数的位数会先增加到16位/32位,而后进行位操作。也就是在位操作之前,数据需要先补位,补位涉及到一个关键问题:有符号数的负数补位会将高位所有二进制位补为1,而其他情况均以0补位。因此,一定要给两个被合成数据的低位 &0xFF或0xFFFF,来将补位强制为0。以保证数值正确。
一个short(long)类型双(四)字节的二进制值 拆分char(short)类型单(双)字节二进制值:
short value;
char valueLo = value & 0xFF;
char valueHi = (value >> 8) & 0xFF;
long value;
short valueLo = value & 0xFFFF;
short valueHi = (value >> 16) & 0xFFFF;
注意:一般先写低位,防止高位移位操作改变原数据。此例中没有该问题,但要注意。