原码补码与反码
Posted PacosonSWJTU
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原码补码与反码相关的知识,希望对你有一定的参考价值。
【README】
1.本文内容总结自“哈工大刘宏伟”老师的mooc视频《计算机组成原理》on bilibili;
2.为了便于理解,本文引入了逗号分割符号部分和数组部分,计算机存储数据的时候没有逗号;
【1】原码表示法
原码定义: 原码是真值保存在计算机当中的数据格式,包括寄存器,内存等;其数值位数是有限的(超出的部分会被丢弃)
例子:
- 正整数原码: x=+1110 ;x原 = 0,1110 (符号和数值通过逗号隔开)
- 负整数原码: x=-1110 ;x原 = 10000 - (-1110) = 1,1110;(符号和数值通过逗号隔开)
- 正小数原码:x=+0.1101;x原=0.1101 (符号和数值通过小数点隔开)
- 负小数原码: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即可得到补码;
例子:
- 正整数补码:x=+1000110; x原=0,1000110;x补=0,1000110
- 负整数补码:x=-1010;x原=1,1010;x补=1,0110
- 正小数补码:x=+0.1010;x原=0.1010;x补=0.1010
- 负小数补码: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得到补码;
【3】反码
反码: 和补码类似,把减法转换为加法;
通过观察(或数学归纳法证明),我们发现:
- 反码转原码快捷方式:当真值为负数,则补码符号位不变,数值部分每位取反得到原码(末尾不需要加1);
- 原码转反码快捷方式:当真值为负数,则原码符号位不变,数值部分每位取反得到补码(末尾不需要加1);
例子:
以上是关于原码补码与反码的主要内容,如果未能解决你的问题,请参考以下文章