原码补码与反码

Posted PacosonSWJTU

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原码补码与反码相关的知识,希望对你有一定的参考价值。

【README】

1.本文内容总结自“哈工大刘宏伟”老师的mooc视频《计算机组成原理》on bilibili;

2.为了便于理解,本文引入了逗号分割符号部分和数组部分,计算机存储数据的时候没有逗号;

 


【1】原码表示法

原码定义: 原码是真值保存在计算机当中的数据格式,包括寄存器,内存等;其数值位数是有限的(超出的部分会被丢弃)

例子:

  1. 正整数原码: x=+1110 ;x原 = 0,1110 (符号和数值通过逗号隔开)
  2. 负整数原码: x=-1110 ;x原 = 10000 - (-1110) = 1,1110;(符号和数值通过逗号隔开)
  3. 正小数原码:x=+0.1101;x原=0.1101 (符号和数值通过小数点隔开)
  4. 负小数原码:x=-0.1101 ;x原=1 - (-0.1101)  = 1.1101 (符号和数值通过小数点隔开)

【2】补码表示法

补码定义: 为了把加法和减法合并为加法(归一化),即为了简化算术逻辑单元(ALU)的设计,引入补码让计算机只做加法(把减法转换为加法)

例: x - y = x + (y)的补码; 这样就可以把减法转换为加法;

补充: CPU = ALU + CU; 中央处理器=算术逻辑单元 + 控制单元;

【引入补码的背景】

 以时钟为例:现在是6点;要想时钟走到3点,有两种方法:

  • 方法1: 逆时针拨动3个单元(减3);
  • 方法2: 顺时针拨动9个单元(加9);

以上两种方法的效果一样(3与9之和为12,mod12),借助以上实例,容易理解补码;

注意:负小数点补码都是取模2

为啥是模2,因为负整数x的补码是 2^(n+1) + x ,其中n为整数数值部分位数; 又负小数的整数位数为0,所以负小数的补码等于 2^(0+1)+x = 2+x ;

以上公式模拟推导过程(转自视频截图):

 

问题: -1011的补数为+0101; 那 +0101表示的是 -1011的补数,还是+0101本身呢?

解决方法:

正数+0101 表示为 0,0101 (符号位,数值部分)正数补码添上1个0;

负数-1011 表示为 1,0101 (符号位,数值部分)负数补码添上1个1 ;

【负数】如何实现在负数补码的符号位设置为1经观察发现(也可以通过数学归纳法证明出来)负数加上2^(n+1) 得到其补码;n为原码的位数

取模2^(n+1) ;n=数值位数;

2^(4+1) - 1011=1,0101 ;计算过程如下:

100000

-1011

 =11111 – 1011 + 1 = 10100 + 1 = 10101 ;而补码10101是真值-1011的原码1,1011 的数值部分每位取反(得到10100),末位加1获得的;

【正数】补码也可以通过加上 2^(n+1) 来计算补码

如正数真值=+1011

01011

  +100000

  =101011

红色1被丢弃

【求补码的快捷方式】

计算补码快捷方式当真值为负数(注意是负数),原码符号位不变,数值部分每位取反,末位加1即可得到补码;

 

例子:

  1. 正整数补码:x=+1000110; x原=0,1000110;x补=0,1000110
  2. 负整数补码:x=-1010;x原=1,1010;x补=1,0110
  3. 正小数补码:x=+0.1010;x原=0.1010;x补=0.1010
  4. 负小数补码:x=-0.1010;x原=1.1010;x补=1.0110

例子2:已知 x补 = 0.0001 ,求x(真值);

  • 因为 x补=x;所以x=+0.0001

例子3:已知 x补=1.0001;求x(真值) ?

  • 因为x补=2+x;
  • 所以x(真) = x补 - 2 = 1.0001 - 10.0000 = -(10.0000 - 1.0001) = -0.1111
  • 所以 x真=-0.1111 ;x原=1.1111 ;x补=1.0001 ;

通过观察(或数学归纳法证明),我们发现:

  1. 补码转原码快捷方式:当真值为负数,则补码符号位不变,数值部分每位取反,末尾加1得到原码;
  2. 原码转补码快捷方式:当真值为负数,则原码符号位不变,数值部分每位取反,末尾加1得到补码;

【3】反码

反码: 和补码类似,把减法转换为加法;

 

通过观察(或数学归纳法证明),我们发现:

  1. 反码转原码快捷方式:当真值为负数,则补码符号位不变,数值部分每位取反得到原码(末尾不需要加1);
  2. 原码转反码快捷方式:当真值为负数,则原码符号位不变,数值部分每位取反得到补码(末尾不需要加1);

例子:

以上是关于原码补码与反码的主要内容,如果未能解决你的问题,请参考以下文章

原码,反码,补码浅谈

原码 反码 补码 移码

八原码,反码,补码

原码反码补码

反码和补码

原码反码补码详解