挑战408——组成原理(3)——原码,补码,反码

计算机中的数据分为数值数据和非数值型数据(如声音,图像等等)。我们接下来主要谈的是数值型数据。
在现实的生活中,数值数据主要分为实数和整数两大类,在计算机中,整数用定点数表示,实数用浮点数表示,而所有带符号的整形都用补码表示。目前通用计算机中浮点数大多数采用IEEE754标准,其中尾数采用定点原码表示,所以浮点数的算术运算涉及原码的加减乘除运算。

无符号数与有符号数

无符号数,即没有正负号的数,是数的绝对值,在其面前添上正负号,便成了有符号的数。计算机的数均存放在寄存器中,通常我们称寄存器的位数为机器字长,当存放有符号数的时候,需要占用以为存放符合位,所有,如若机器字长为16位,那么:

  • 无符号数可表示的范围为 0 — 2^(16) -1
  • 有符号数可表示的范围为 -2^15 — 2^(15) - 1

15次方是因为符号位占用了一位。
那么计算机如何表示有符号数呢?我们规定,用0表示正号,用1表示负号,这样符号也就被数字化了,并规定放在有效数据之前,例如:
+0.1011 在机器中表示为0(小数点位置)1011
-1100 在机器中表示为1,1100(小数点位置)
为了方便区分手写的数和将符号数字化的数,我们把前者称为真值,后者称为机器数。即
-1100(真值) -> 11100(机器数)
将符号数字化以后带来了新的问题,运算时,符号位是否参与运算,如果是,那么如何处理?为了处理好这些问题,于是就引入了原码,补码,反码和移码等编码方式。

原码

原码,又称带符号的绝对值表示,符号位为0表示正,为1表示负。用大白话来讲,就是直接将数值部分写成二进制数然后前面添上0或者1,用来表示正负号。
在这里插入图片描述
在这里插入图片描述
其实上面的公式我们只需要了解即可,实际的转换很简单
比如X = +1110时 [X]原 = 0,1110
X = -1110时 [X]原 = 1,1110 (逗号只是为了区分符号位实际不存在)
X = 0.1101时 [X]原 = 0.1101
X = -0.1101时 [X]原 = 1,1110(注意不是10.1101,因为0并不是有效数据位)。

注意

  1. 若字长为n+1,那么原码整数的表示范围为:在这里插入图片描述
  2. 原码中0的表示方式有两种:在这里插入图片描述
补码

如果说是这几种码制中最重要的编码方式,一点也不为过。计算机中存放的数值方式大多数是用补码存放,计算(尤其是减法做加法运算时)时也通常采用补码运算方式,因此要对补码非常敏感。

在这里插入图片描述
在这里插入图片描述
对于纯整数:在这里插入图片描述
对于纯小数:
在这里插入图片描述
而对于0而言,
在这里插入图片描述
具体的实例不举先,先看看我们的反码,我们没有必要按上面的数学公式往上套。

反码

反码,通常用来由原码求补码或者由补码求原码的过渡环节。
我们先看看数学定义:
在这里插入图片描述
在这里插入图片描述
对于纯小数:
在这里插入图片描述
对于纯整数:
在这里插入图片描述
所以,记住上面的就够了,我们具体看看运算过程,取反操作就是将原码中的0换成1,1换成0.就完事了。
当X = +1101时,X反 = 0,1101
当X = -1101时,X反 = 1,0010(当为负数的时候,符号位不变,数值位执行取反操作)
当X = +0.0110时,X反 = 0.0110
当X = -0.0110时,X反 = 1.1001

对于0来说,反码的表示方式也有两种(0,000或者1,111),这就自己去写了。

三种码制之间的关系(最重要)

前面的数学公式是应付表示范围类的题目,那么这些内容就是应付计算题的题目:

  • 三种机器码的最高位均为符号位,符号位与数值位用逗号隔开
  • 真值为正时,原码补码反码表示方式相同。
  • 真值为负时,三者表现都不同,但是符号位都用1表示,补码可以用“原码求反(不含符号位)后加1”求得。而反码是原码除了符号位以外的部分都进行取反操作

下面举个简单的计算例子:
在这里插入图片描述

移码

当真值用补码表示的时候,由于符号位与数值位一起编码,这与习惯上表示不同,我们很难从补码形式上直接判断真值的大小。但是如果对每个真值位(注意不包含符号位),都加上一个2^n(n为整数位),那么在数轴上,移码表示的范围恰好对应真值在数轴上移动2的n次方个单元。所以叫做移码。
在这里插入图片描述
它常常用来表示浮点数的阶数,因为它只能表示整数。
对于移码来说,0的表示是唯一的,假设字长为6位(含一个符号位)那么0的表示为:
+0移 = (2^5) + 0 =1,00000
-0移 = (2^5) - 0 =1,00000
特点

  1. 0 的表示方式唯一
  2. 对于同一个真值,移码和补码相差一个符号位,且相反,例如:-11110 补码为1,00010,移码为:000010
  3. 引入移码是为了直观的判断真值大小,所以移码大,真值就大
### 原码补码反码的概念 在计算机组成原理中,原码补码以及反码是用来表示带符号二进制数的方法。 #### 原码定义 对于正数而言,其原码就是该数对应的二进制形式;而对于负数,则最高位作为符号位设为1,其余各位保持不变。例如,十进制中的`+7`的8位二进制原码是`0000 0111`,而`-7`则是`1000 0111`[^1]。 #### 反码定义 针对正数来说,它的反码与其原码相同;但对于负数,除了最左端的符号位外,其他所有位都要按位求反(即0变1,1变0)。比如,上述提到的`-7`,当采用八位来表达时,在得到原码之后将其余七位取反可得反码`1111 1000`[^3]。 #### 补码定义 同样地,正数的补码等于自身的原码;不过对于负数来讲,先计算出这个数的反码,然后再给整个数值加上一即可获得最终的结果。继续以上述例子说明,`-7` 的补码会变成 `1111 1001`[^2]。 ### 各种编码之间的相互转换 为了更好地理解和处理这些不同的编码方式,掌握它们之间如何互相转变是非常重要的: - **由原码反码**:如果是一个正值或者零的话,那么两者完全一致;如果是负值则除开首位之外每一位都做反转操作。 - **从反码补码**:只要简单地向已知的反码上增加一个单位就可以完成这一过程了。 - **通过补码还原回原码**:这一步骤相对复杂一点,因为需要区分对待正负两种情况——正数情况下二者相等;若是遇到的是负数,则应首先减去最低有效位上的那个‘1’从而恢复成反码状态,接着再次逐位翻转非符号部分以返回最初的原貌。 ```python def int_to_binary(value, bits=8): """Convert an integer to its binary representation with specified bit length.""" if value >= 0: return format(value, &#39;0%db&#39; % bits) else: return bin(((1 << bits) + value))[2:] print(int_to_binary(-7)) # Output will be the two&#39;s complement of -7 in 8-bit form. ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值