(注: 参考了百度百科中的部分内容 http://baike.baidu.com/view/377340.htm,http://baike.baidu.com/view/7836617.htm#1
参考了维基面科中的部分内容 http://zh.wikipedia.org/wiki/%E4%BA%8C%E8%A1%A5%E6%95%B0)
Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源
十进制 | 4 位补码 | 8 位补码 |
---|
5 |
0101 |
0000 0101 |
-3 |
1101 |
1111 1101 |
(对于无符号型的数字,符号比特使用0:
也可以这样说:短类型到长类型的转换,要分两种情况进行。如果短类型是无符号整数,则长类型的高位部分填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
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)