现在的位置: 首页 > 综合 > 正文

补码

2013年12月11日 ⁄ 综合 ⁄ 共 1863字 ⁄ 字号 评论关闭
1. 补码概念(计算计系统计算的基础)
补码(two's complement)
计算机系统中,数值一律用补码来表示(存储)。
正数的补码是其本身(正数的原码、反码、补码都是其本身),例如char=5 表示为 0000 0101
负数的补码是其对应正数按位取反+1,例如char=-5 表示为 1111 1011
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。
例子:两都相加的效果(5+-5我们知道为0的,计算机怎么算呢,使用补码就很好算了,只接用数字电路的加法器)
  0000 0101
  1111 1011
+=========
1 0000 0000
因为是8字节的,高位溢出掉,结果也就是0了;这个比采用原码要省很多事(原码char=-5为 1000 0101),这也是一开始计算机系统采用补码的原因。
 
2. 补码符号延展,扩位(用于转换)
将一个特定比特补码系统的数字要以较多比特表示时(例如,将一个字节的变量复制到另一个二个字节),所有增加的高比特都要填入原数字的符号比特。
十进制 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

转自http://blog.csdn.net/chunyexiyu/article/details/8854404

抱歉!评论已关闭.