原码(有符号&无符号)、移码、补码的原理推导及其意义

为什么有原码,补码,移码这么多码呢,这些码是怎么来的?

之前学习的过程中也有这样的疑惑,对于这些问题,本人也有些许思考,故有了此文,本文全部为原创,所以难免有些思考误区和明显的错误,希望大佬们指正

首先我们回到最初最简单的原码,即无符号二进制

一个四位无符号二进制数能表示从0到15(24−12^4-1241)共16个数,但是这16个数目前都表示正数,我们如果想要表示负数怎么办呢

我首先想到的是将这16个数平分,一半表示正数,一半表示正数,则我可以选择从中间划分即:0~7表示正数0到7,8 ~ 15表示负数0 到负7(至于为什么不反过来,本人尚未有答案)

然后我们看看用二进制这样表示是不是可行
在这里插入图片描述
如上述表格所示,我们发现人为设定的负数所对应的二进制数的首位都是1,现人为设定的负数所对应的二进制数的首位都是0

这就很自然的引出了有符号数的表示规则:

即最高位是符号位,0表示正,1表示负,后面三位就是数值位即表示绝对值。

但是这样以来数与数之间的比大小就很难了,计算机内部电路很难实现,所以我们继续想方法解决这个问题,这就要引入移码

移码的计算是真值加上一个偏置值

移码的本意是为了方便两个数作比较(对于电路设计而言),接下来我们推导一下移码的发明过程

首先

对于无符号数很好比较,直接按位从高到低比较,先出现0的那个数就小

比如:111000和

​ 110111

这两个数按位比较,在从左至右第三位上一个是1一个是0,所以第一个数大

这是无符号数,那么对于有符号数就不能按照这样方法比较了,有符号数的比较目前就找不到一个很简洁的比较方式,我们还要设计三套不同的电路分别比较正数和正数,一正一负和负数和负数,另外还要设计电路区分是那种情况,这样无疑非常麻烦

那我们应该怎么比较简单呢

首先的想法是如果负数变成正数那么就很好比较了,两个正数比较只需要从左起第二位开始比较(因为第一位是符号位,正数用0表示),按无符号数的比较方法比较就行

那么如何将负数变为正数呢,
假如我们现在要比较一个负数和一个正数
一个非常直观的做法就是给这个负数加上一个正数α,α加上之后,就能使得这个负数就能变成正数,

其次为了不影响比较,我们同时给要比较的另一个数加上α,这样就能保证比较双方的相对大小不变,此时就变成两个正数比较了

那么这个α很明显要大于β,这个β是所能表示的最小的负数的绝对值

假设我们现在有四位,其中一个数符号位,也就是说有三位是数值位,能表示的最小负数是-7,那么我们取α=8(1000)

然后试验一下看看行不行

我们随便找两个数分别是 -2和3

他们都加上8得:6和11,然后两数再进行比较即可

如果对于一个四位的无符号数(三位有符号数,最高位是符号位,只有三位可以表示数值),

如果α取8,则加上α后真值变为:
在这里插入图片描述
然后将加上偏置值(α)后的真值(表格第三行)转换为二进制,这个二进制就称为真值(第一行)的移码:

在这里插入图片描述
举例说明,对于4位无符号数,1001表示9,根据上面的讨论,从8开始,包括8,一直到四位二进制无符号数能表示的最大值15,这8个数人为规定表示-0到-7

然后为了便于比较正负数,我们给每个数加上一个数α(叫做偏置值),α取值为8(2n−12^{n-1}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值