计算机组成原理——前言

计算机组成原理——前言

计算机的原码、反码、补码(针对有符号数)

计算机中数值都是用补码形式存储的,任何一个二进制数都有对应的自己的十进制数,为一一对应的关系

正数的原码,反码,补码都一样,都是符合下面原码的定义的
负数的原码,反码,补码各不相同,下面所描述的原码,反码,补码定义针对的是负数

原码:原码中"原"为原生态的意思,即你看到这个数字,根据其他进制的规律,很容易就可以写出二进制表示形式,即原码是按照最高位为符号位,其他位为数值位的格式,自然而然可以写出的二进制序列,比如-2为100…0010,在进行原码计算的时候,符号位和数值位是分开计算的。原码中有正零和负零之分,对应的二进制序列是不同的

反码:原码的符号位不变,其他位按位取反,得到反码。反码是一个原码变成补码,或者补码变成原码的过渡形式而已,平时基本不提反码

补码:反码加一得到补码。只要是数字,内存中储存的就是其对应的二进制补码,使用补码,可以将符号位和数值位统一处理(在运算过程中,符号位与数值位同时加入计算),同时在运算上,加法和减法也可以统一处理(CPU只有加法,本质只能做加法运算,a-b转换为a+(-b)),而且补码和原码的相互转换,其运算结果是相同的,不需要额外的其他硬件电路

纯整数的原码

对于一个n位的纯整数来说,最高位为符号位,其他n-1位皆为数值位
根据原码定义,可知:
最大值就是 符号位为0,其他n-1位皆为1 的数值,即为 2n-1 -1
最小值就是 符号位为1,其他n-1位皆为1 的数值,即为 -(2n-1 -1)
于是范围是[-(2n-1 -1),2n-1 -1]

纯小数的原码

对于一个n位的纯小数来说,最高位为符号位,其他n-1位皆为数值位
根据原码定义,可知:
最大值就是 符号位为0,其他n-1位皆为1 的数值,即为 == 1-21-n==
最小值就是 符号位为1,其他n-1位皆为1 的数值,即为 -(1-21-n)
于是范围是[-(1-21-n),1-21-n]

纯整数的反码

对于一个n位的纯整数来说,最高位为符号位,其他n-1位皆为数值位
根据反码与补码的关系,可知:
最大值就是 符号位为0,其他n-1位皆为0 的数值,即为 2n-1 -1
最小值就是 符号位为1,其他n-1位皆为0 的数值,即为 -(2n-1 -1)
于是范围是[-(2n-1 -1),2n-1 -1]

纯小数的反码

对于一个n位的纯小数来说,最高位为符号位,其他n-1位皆为数值位
根据反码与补码的关系,可知:
最大值就是 符号位为0,其他n-1位皆为0 的数值,即为 == 1-21-n==
最小值就是 符号位为1,其他n-1位皆为0 的数值,即为 -(1-21-n)
于是范围是[-(1-21-n),1-21-n]

纯整数的补码

对于一个n位的纯整数来说,最高位为符号位,其他n-1位皆为数值位
根据补码和原码的关系,我们很难一眼根据原码的范围得到补码所代表的范围,现在,我带领读者认识到两个方面后,就可以轻松得到补码所代表的范围了

第一个方面——原码转化为补码的等效方法

首先,由补码定义知道,补码和原码之间的关系为:原码的数值位按位取反,再加1即为对应的补码。然后,想想看是否可以将这个过程进行一个等效替换,比如在"原码的数值位按位取反"这个步骤上,其实可以将其等效为使用 全为1(包括符号位和数值位,即n位全为1)的二进制序列 减去 这个负数的原码对应的正数的原码(读者可以自行验证一下)于是现在将一个负数的原码(n位)转化为对应的补码(n位),新增了一种方法,即为

1.全为1(包括符号位和数值位,即n位全为1)的二进制序列 减去 这个负数的原码对应的正数的原码
2.得到的结果再进行加1

最终的计算结果就是这个负数的原码对应的补码

第二个方面——一个n位的二进制序列,可以表示的数值个数 和 无符号数/有符号数 的关系

一个n位的二进制序列,可以表示的数值个数 和 无符号数 的关系:
一个n位的二进制序列,可以表示的数值个数,很容易知道,即为2n ,而同时一个n位的二进制数所对应的无符号数的最大数值为2n -1,由此我们可以看到一个n位的二进制数,可以表示的数值个数和最大无符号数的关系为:

一个n位的二进制序列,可以表示的数值个数 = 最大无符号数 + 1

一个n位的二进制序列,可以表示的数值个数 和 有符号数 的关系:
有符号数,是有分负数和正数的,而一个n位的二进制序列,可以表示的数值个数为2n,即该二进制序列表示的负数个数+正数个数即为2n

总结

认识到了这两个方面以后,我们再将二者融合起来:
从方面一中,那个n+1位的二进制序列(除了第n+1位为1,其他位均为0),可以看成一个n+1位的无符号数,即可以写成2n -1,恰恰好,定义中的原码转补码最后需要有一个"加1"的操作,同时这里有一个"减1"的操作,可以相互抵消。于是现在将一个负数的原码(n位)转化为对应的补码(n位),新增了一种方法,即为

1.写出无符号数2n 对应的二进制序列(n+1位,最高位为1,其他位全部为0)
2.将这个序列减去这个负数的原码对应的正数的原码

最终的计算结果就是这个负数的原码对应的补码

如果将这个过程对应到无符号数上,就是与一个负数的补码具有相同二进制表示形式的无符号数即为无符号数2n 减去与这个负数对应的正数具有相同二进制表示形式的无符号数,得到的那个无符号数,比如,当n = 8时,2n 即为256,如果我们要得到-2对应的补码的二进制表示形式,可以将256-2(-2对应的正数为2),得到254,然后将254看作一个无符号数,转化为无符号数的二进制序列,这个二进制序列即为-2对应的补码的二进制表示形式

据此,我们就可以知道一个8位的、可以表示的数值个数为2n 的二进制序列,中-1补码的二进制表示形式与无符号数255的二进制表示形式相同,-2补码的二进制表示形式与无符号数254的二进制表示形式相同,-3补码的二进制表示形式与无符号数253的二进制表示形式相同…,-127补码的二进制表示形式与无符号数129的二进制表示形式相同(由于负数只有8位,于是最多到-127)

正负零,于是

纯小数的补码

对于一个n位的纯小数来说,最高位为符号位,其他n-1位皆为数值位

学习过程中需要具备的思想

对于一个复杂性较大的系统进行设计时,可以采用

  • 抽象法
    • 将一些不必要的细节隐去,抓住事物的主要矛盾,忽略次要矛盾
    • 例如:数据结构中的抽象数据类型的概念
  • 3Y法
    • 层次化:将被设计的系统划分为多个模块或子模块
    • 模块化:定义明确的功能和接口
    • 规则性:进行通用性高的设计
    • 例如:网络中的TCP/IP模型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值