计算机原码反码补码_补码原码反码怎么转换

(1) 2024-07-30 11:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
计算机原码反码补码_补码原码反码怎么转换,希望能够帮助你!!!。

一、为什么计算机中的数据以补码的形式存储?

计算机更擅长加法运算,减法运算是在计算机处理器的加法器的基础上而实现的,既然计算机更擅长加法运算,那么计算机的设计者当然就只能在加法器的基础上引入“补码运算”来实现减法运算,从而也能推进乘除运算的实现。
数电书本上对此的解释:

如果我们再能设法将减法操作转化为某种形式的加法操作,那么加、减、乘、除运算就全部可以用“移位”和“相加”两种操作实现了。利用上述特点能使运算电路的结构大为简化。这也是数字电路中普遍采用二进制算术运算的重要原因之一。 在作减法运算时,如果两个数是用原码表示的,则首先需要比较两数字的绝对值的大小,然后以绝对值大的一个作为被减数、绝对值小的一个作为减数,求出差值,并以绝对值大的一个数的符号作为差值的符号。不难看出,这个操作过程比较麻烦,而且需要使用数值比较电路和减法运算电路。**如果能用两数的补码相加代替以上的减法运算,那么计算过程中就无需使用数值比较电路和减法运算电路了,从而使运算器的电路结构大为简化**。 

二、计算机只基于处理器的加法器是怎么通过“补码运算”来实现减法运算的呢?

1.减法运算的关键原理:加法器的溢出清零功能

1.1 溢出清零功能的介绍

加法器拥有溢出清零的功能,溢出清零的功能讲解如下:
加法演示,列如,一个无符号xhar型8bit数A与数B相加,则它们的溢出触发值(模数)是2^8=256,当A+B>=256时,A+B的运算结果为A+B-256。

1.2 减法运算的实现

溢出清零的功能清楚了,那下面讲解利用溢出清零功能怎么实现减法运算:
假设数M和N都是一个4bit的数,则它们的加法器溢出触发值是2^4=16。
当M=7,N=4时,运算M-N:
“7-4=3"就相当于"7+(-4)”,现在变成了加法运算,可是里面带有负数,而加法器不知道什么是负数,怎么将‘-4’转化为一个正数且能得到"7+(-4)"相同的运算结果勒,于是利用加法器具有溢出清零的这一特点,想到办法,"7+(-4)“可等同于”7+(-4+16)”,"7+(-4+16)“即为"7+12”,现在我们人为的将’-4’转化为了正数12,然后现在我们把两个正数’7’和’12’交给加法器(注意,加法器接收7和12时会为其添加符号位,7的最高位符号位为0,12的最高位符号为1),让他们进行加法运算,加法器拥有溢出清零功能,很明显"7+12"在加法器的运算下结果为3,然后加法器将此结果返回给用户,此结果与"7-4"的结果一模一样,这个流程图是这样:计算机原码反码补码_补码原码反码怎么转换_https://bianchenghao6.com/blog__第1张

2.补码运算的原理

1.1 补码运算规则为什么是那样的?

*正数的补码=该正数的原码(即对该正数不做处理)
*负数的补码= 该负数的反码 + 1 (负数的反码=除符号位之外的所有位取反)
对于某本身有符号char型8bit二进制数的运算式"12+(-120)“中(-120)使用M表示,除掉最高位符号位,溢出触发值为2^7即128,很明显,M(原码)+M(反码)+ 1 = 128,比如4位二进制码"1100 + 0011 + 1 = 16”,所以补码运算的这一过程就是相当于运算式:M(补码) = 128 - M(原码),重点来了,看到这里是不是和本文章的第二章的(1.2)节的负数转换原理一模一样。
结论:负数的补码运算过程规则就相当于是,M(补码) = 128 - M(原码)

1.2 减法运算的3种运算情况,补码运算是怎样解决非符号位的进位机制和符号位的运算机制的?怎么解释其补码运算规则的合理性?

其实使用图片进行解释和描述的话会更加的生动形象,图片绘画比较麻烦,本人只作了一部分图片演示 

在这里规定被减数和减数都为正数,减法运算格式为:

 (+-)被减数 - 减数 = 结果 (+-)被减数 + (-减数) = 结果 

这里我引入几个自己编的几个概念,以方便问题的解说:

被减数数模宽:被减数数模宽 = 模数(溢出触发值) - 被减数 减数数模宽:减数数模宽 = 模数(溢出触发值) - 减数 被减数前面带负号时,被减数数模宽相当于(-被减数)的补码的非符号位的数值 减数前面带负号时,减数数模宽相当于(-减数)的补码的非符号位的数值 

(1)被减数前面不带负号,被减数的绝对值>减数的绝对值时,最终计算结果大于0

此时'被减数'的补码就是其原码,'-减数'的补码就是取反再加1 由已知条件可得 被减数的绝对值 > 模数 - 被减数 即使得 被减数 + [减数数模宽] > 模数 故 被减数 + '(-减数)补码'的绝对值 > 模数 所以'被减数'和'(-减数)的补码'在进行相加时一定会使得非符号位的数值之和大于溢出触发值,这样就会产生进位,使得符号位加1,从而使得结果变为正数,此时该正数就是整个减法运算的最终结果 例如等式:14 - 12 14的二进制数码是01110,-12的二进制数码是11100,-12的补码为10100,对各自的补码进行运算如下: 0 1 1 1 0 +1 0 1 0 0 0 0 0 1 0 最终结果为00010,即2 

下面我使用图片演示了对"14-12"进行计算流程,更加通俗易懂,首先我规定几个符号,M代表被减数,M(宽)代表被减数数模宽,N代表减数,N(宽)代表减数数模宽,如图:
计算机原码反码补码_补码原码反码怎么转换_https://bianchenghao6.com/blog__第2张
(2)被减数前面不带负号时,被减数的绝对值<减数的绝对值,最终计算结果小于0

此时'被减数'的补码就是其原码,'-减数'的补码就是取反再加1 由已知条件可得 被减数的绝对值<模数-被减数 即使得 被减数 + [减数数模宽] < 模数 故 被减数 + '(-减数)补码'的绝对值 < 模数 所以'被减数'和'(-减数)的补码'在进行相加时一定会使得非符号位的数值之和大于溢出触发值,这样就不会产生进位,即符号位不会有变化,结果变为负数,此时再对该负数求取补码,该补码才是整个减法运算的最终结果 例如等式:2 - 4 8的二进制数码是00010,-4的二进制数码是10100,求取各自的补码进行运算如下: 0 0 0 1 0 +1 1 1 0 0 1 1 1 1 0 最终结果为11110,即其补码是10010,即-2 使用图片演示的流程图与(1)图类似,我就在此不加图片了。 

(3)被减数前面带负数时,最终计算结果一定小于0

此时,运算结果一定为负数,即在补码运算时符号位一定置为1,最终结果一定是负数,所以接下来我们只需要关心补码运算中的非符号位数值的运算过程 (-被减数)的补码绝对值 = 模数 - 被减数 (-减数)的补码绝对值 = 模数 - 减数 补码相加结果绝对值 = (-被减数)的补码绝对值 + (-减数)的补码绝对值 补码相加结果绝对值 = 模数 - 被减数 + 模数 - 减数 = 模数 + 模数 -(减数+被减数),加法器具有溢出清零的功能,此时有两种情况: A. [减数 + 被减数 > 模数] 时,补码相加结果绝对值 < 模数,不会溢出,则补码相加结果绝对值 = 模数 - 被减数 + 模数 - 减数 最终结果的绝对值 = 模数 - 补码相加结果 = 减数 + 被减数 -模数 *所以补码运算与真实的减法运算逻辑推理相比较具有一致性,很合理 B. [减数 + 被减数 < 模数]时,补码相加结果绝对值 > 模数,会溢出,则补码相加结果绝对值 = 模数 - 被减数 + 模数 - 减数 - 模数 = 模数 - 被减数 - 减数 最终结果的绝对值 = 模数 - 补码相加结果 = 减数 + 被减数 *所以补码运算与真实的减法运算逻辑推理相比较具有一致性,很合理 

结论:
对于减法"M - N,M和N都是正数",当M > N时,M补码的非符号位与(-N)补码的非符号位相加的结果一定会大于模数(溢出触发值),会向符号位产生进位,补码运算结果为正,则减法式的最终运算结果也为正数;当M < N时,M补码的非符号位与(-N)补码的非符号位相加的结果一定会小于模数(溢出触发值),不会向符号位产生进位,补码运算结果为负,需要对该运算结果求取其补码,才得到减法式的最终结果。

所以补码的转换规则以及运算规则都是根据实际的减法运算逻辑进行规定和推导的,与真实的减法运算逻辑具有一致性,很合理 

希望本文能对你有所帮助,若本博文有不当之处,望指出!

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复