计算机组成原理--补码和原码的互换

  在上篇博文求补码的绝对值中,做而论道介绍了 “求补码的绝对值” 的算法与电路。

  求补码的绝对值所用的算法,是做而论道自己想出来的。 所用的电路器件,是计算机专业教材中遗漏的减法器。 实用电路也是做而论道自己设计的。 对于正数的补码,该电路就不做任何变换,直接按照原样输出。因为正数的补码本身,就是 “首位为 0,0 后面就是数值的绝对值” 。直接输出就能得到正数补码的绝对值。 对于负数的补码,就要做一些变换,才能得到绝对值。 变换的方法,做而论道采用了 “0-X” 的算法。 这种算法,要比计算机教材中介绍的 “取反加一” 方法浅显易懂,也更切合数学的基础理论,用减法器来实现此算法时,电路也更加简单。

  本博文打算在上篇博文的基础上,做一些改动,使得电路可以实现 “补码与原码” 的互相转换。

  虽然,在计算机系统中,正负数值,一律采用补码表示和存储。 但是,总有人认为计算机中还有原码存在。 虽然,这种想法并不符合实际情况,但是,做而论道还是想给这种人帮一个忙。 故此,就打算《计算机组成原理》课程中,添加一个电路,进行 “补码与原码的互相转换”。

  补码与原码相比较,最高位的符号位是相同的。 正数的补码和正数的原码,也是相同的,不需要变换,那就直接输出吧。 而负数的补码,符号位后面的数值位,需要经过 “0-X” 运算,才是原码的数值位。 如果就这么变换并输出,这就是 “补码的绝对值” 了,并不是 “补码所对应的原码” 。

  差在什么地方呢? 是符号位!
  只要把负数补码绝对值的最高位,改为 1,就是负数的原码!
  分析明白了这些,就好办了,也就是一个或门的事!

  另外,补码变到原码、原码变到补码,方法是相同的。 难怪有人说:补码的补码,就是原码。 当然,这说法是有语病的。 应该说:负数原码的数值位,取反加一后(符号位不变),就是负数的补码、再次取反加一,就又变回了负数的原码。

  下图就是做而论道设计的 “原码与补码互换” 电路。

  图中的核心部分,是一个八位的 ALU,可做加/减法运算。
  数值 A,已经置为全零。
  数值 B,可由你自由输入八位二进制数。 图中输入的是:1111 1101,这是-3 的补码。
  数值 B 的最高位 B7,直接控制着 S2S1,反相后,又连接到 S3S0。
  当 B7 为 0 时,S3S2S1S0 = 1001,ALU 芯片将做加法运算:A+B+/CN。
    即:F = 0+B+0 = B,直接把 B7~0 输出出去。
  当 B7 为 1 时,S3S2S1S0 = 0110,ALU 芯片将做减法运算:A-B-CN。
    即:F = 0-B-0 = 0-B = 0000 0011,这个结果,只是 B 的绝对值。
    但是,做而论道在电路中,加上了一个或门,当 B7 为 1 时,经过或门,F7 也为 1。     
  所以,最终的 F = 1000 0011,这正是-3 的原码。
  此时就可以说,这个电路,实现了:
补码到原码的转换。

  如果输入的 B 是正数的补码,B7 就是 0。这个 0 通不过或门,影响不到 F7 的值。

  下面换一种说法。

  还是上面的这个截图。
   输入的数据 B = 1111 1101,也可以认为是-125 的原码。 
   电路输出的 F = 1000 0011,则正是-125 的补码。
  如此来说,本电路,也能实现:
原码到补码的转换。

  也就是说:
   你输入的 B 是负数的原码,本电路输出的,就是负数的补码。

   你输入的 B 是负数的补码,本电路输出的,就是负数的原码。

  如果你输入的是正数的原码(或者补码),本电路就会原样输出。
   你说它输出是原码或者是补码,都行啊!
   反正,正数的原码和补码都是一样的。

  针对本电路,可以输入 256 种不同 B,电路输出的 256 种 F,都是正确的。做而论道就不一一截图了。
  感兴趣的网友,可以按照此图自己进行实验。输出的结果,保证是没错的!

--本文完--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值