十进制 | 4 位补码 | 8 位补码 |
---|
5 |
0101 |
0000 0101 |
-3 |
1101 |
1111 1101 |
短类型到长类型的转换,要分两种情况进行。如果短类型是无符号整数,则长类型的高位部分填0;如果短类型是有符号整数,则长类型的高位部分填短类型的符号位。
例子
char cTemp = 0xFF; //(-1)直接存储
unsigned char ucTemp = 0xFF; //(255)
int iTemp1 = cTemp; // 值为 0x FF FF FF FF // -1 //根据符号延展特点,char转int,缺3个字节,补充出来就是0xFF FF FF FF,也是-1
int iTemp2 = ucTemp; // 值为 0x00 00 00 FF // 255 //根据符号延展特点,unsigned char的符号位为0,补充出来就是 0x00 00 00 00 FF,也是255
3. 短类型-->长类型转换规则次序
转换规则顺序如下图所示。
double ← float 高
↑
long
↑
unsigned
↑
int ←char,short 低
结合补码的结构和补码的延展特点,对于数字的转换非常有处
例如:char cTemp = 0xFF; //对于char型FF也就是-1
unsigned char ucTemp = cTemp; // 0xFF不考虑符号的话,就是255了
unsigned int uiTemp = cTemp; // 这个转换就有点特殊了,char会首先转为int,然后再由int赋值给unsigned int. 值为 0x FF FF FF FF,为正的2^32-1
4. 长类型-->短类型转换
长类型到短类型的转换,采用直接截断的方式,根据字节序的不同,截取物理上的前几个字节或后几个字节,得到的效果是一致的,最终取低位值赋值给短类型。
使用little-endian的话,也就是最常用的字节序(具体参考另一篇文章:字节序),类型转换时:取低地址上的对应数字
例如:int iTemp = 0x12345678; //例如存储为 1000(0x78), 1001(0x56), 1002(0x34), 1003(0x12)
short sTemp = iTemp; // 取值为0x5678 // 例如存储为 1000(0x78), 1001(0x56)
char cTemp = iTemp; // 取值为0x78 // 例如存储为 1000(0x78)
使用big-endian的话(也称为网络字节序),类型转换时:取高地址上的对应数字
例如:int iTemp = 0x12345678; //例如存储为 1000(0x12), 1001(0x34), 1002(0x56), 1003(0x78)
short sTemp = iTemp; // 取值为0x5678 // 例如存储为 1002(0x56), 1003(0x78)
char cTemp = iTemp; // 取值为0x78 // 例如存储为 1003(0x78)
相关阅读:http://blog.csdn.net/beyond_cn/article/details/4410843