机器码的表示--原码、反码、补码、移码

    今天做笔试题时遇到的一个小问题:在机器码的表示方法中,有哪些方法对0的表示方式是唯一的? 毫不犹豫的选择了补码。后来发现我错了,居然还有移码这个东东。

原文地址数据表示——原码、反码、补码、移码

到目前为止,我们学习了十进制、二进制、八进制、十六进制等用来代表实际数值的数,称为真值,这些数我们再日常生活中都会使用到,那么在计算机中数值是怎么来表示的呢?

          数在计算机中的表示形式统称为机器数。计算机中处理数据及运算都是采用二进制,通常规定机器数用八位二进制表示。实用的数据有正数和负数,因为计算机只能表示01两种状态,数据的正号“+”或负号“-”,在计算机里就用一位二进制的01来区别,通常放在最高位,成为符号位。 符号位数值化之后,为能方便的对机器数进行算术运算、提高运算速度,计算机设计了多种符号位与数值一起编码的方法,最常用的机器数表示方法有:原码、反码、补码和移码,下面就分别介绍一下它们的表示方法。

 

一、原码、反码、补码

           三种表示法的转换过程如下:



说明:

 特别的,在原码中0有两种表示方式:[+0]=0000000,[-0]=1000000。

 在反码表示中,0也有两种表示形式:[+0]=0000000,[-0]=11111111

 在补码表示中,0有唯一的编码:[+0]=0000000,[-0]=0000000。


二、移码

           因为个人移码理解有点困难,so单独解释一下:

           移码表示法是在数X上增加一个偏移量来定义的,常用来表示浮点数中的阶码,所以是整数。如果机器字长为n,规定偏移量为2^(n-1)。X是整数,则[X]=2^(n-1)+X

     则[+45]=+0101101+10000000,   [-45]=-0101101+10000000=01010011

     实际上由此可推出,在偏移2^(n-1)的情况下,只要将补码的符号位取反便可获得相应的移码表示。

        


说明:在移码表示中,0也编码是相同的,[+0]=1000000,[-0]=1000000。


          计算机之所以这些编码方法是为了便于运算,提高运算速度。四种表示方法其实是层层递进的,即会求十进制的二进制表示,记住符号位的正负表示,知道怎么递进的它们之间的关系。


### 原码反码补码移码的定义 #### 定义说明 原码是一种最简单的二进制表示方法,其特点是符号位明确区分正负数。对于正数,符号位为`0`,数值部分直接用二进制表示;而对于负数,符号位为`1`,数值部分同样保持不变[^3]。 反码是对原码的一种转换形式。对于正数而言,反码与其原码完全一致;而针对负数,则需将其数值部分按位取反得到反码[^2]。 补码进一步改进了反码的形式,在处理负数时更加高效。具体来说,正数的补码即为其本身,而负数的补码可通过对其反码加一获得。 移码主要用于浮点数中的阶码表示,它通过将真值加上一个偏置量来实现无符号化存储。通常情况下,该偏置量等于\(2^{n-1}\),其中\(n\)代表总位数。 --- ### 数值范围分析 #### 原码的数值范围 假设机器字长为 \( n \) 位(含一位符号位),则: - 正数的最大值为 \( (2^{n-1} - 1)_\text{十进制} \) - 负数的最小值为 \( -(2^{n-1} - 1)_\text{十进制} \) 因此,原码能够表示的整数范围为:\[ -(2^{n-1}-1) \sim +(2^{n-1}-1) \][^3] 值得注意的是,存在两个零值分别对应于 `+0` 和 `-0` 的不同编码方式。 #### 反码的数值范围 同理,当考虑 \( n \)-bit 字长时, - 对应正数最大仍可达至 \(+(2^{n-1}-1)\), - 针对负数情况亦可低达 \(-(2^{n-1}-1)\). 所以反码所能覆盖的整体区间同样是:\[-(2^{n-1}-1),+(2^{n-1}-1)\]. 同样地,这里也存在着两种不同的零表达形式(+0,-0)[^4]. #### 补码的数值范围 利用补码体系下, - 最大正值依旧维持在 \(+(2^{n-1}-1)\); - 不过由于引入了一种额外状态用于填补原本由单独 "-0" 占据的位置,使得现在可以达到更低限度直到 \(-2^{n-1}\). 最终得出结论:采用这种机制之后整个可用空间变为连续闭合区域:[\-2^(n−1)..2^(n−1) −1],并且解决了关于双重零表述的问题.[^4] #### 移码的数值范围 考虑到移码实际上是基于补码基础上增加固定偏移量的结果,故此如果原始补码支持从-\(2^{n-1}\)到+\((2^{n-1}-1)\)之间变化的话,那么相应调整后的实际显示效果就会是从0一直到\(2^n-1\). 这意味着每一个可能产生的组合都被赋予了一个独一无二非重复性的呈现形态. 综上所述,给定任意长度N比特的情况下,我们有如下关系成立: \[ [-(2^{n-1})..(2^{n-1}-1)]_{补码} → [(0)..(2^n-1)]_{移码}. \] --- ```python def range_summary(n_bits): max_positive = (2 ** (n_bits - 1)) - 1 min_negative_original_complement = -(2 ** (n_bits - 1)) result = { 'Original Code': f'{-max_positive} to {max_positive}', 'Complementary Code': f'{min_negative_original_complement} to {max_positive}', 'Offset Binary': f'{abs(min_negative_original_complement)} to {(2**n_bits)-1}' } return result print(range_summary(8)) ``` 上述代码展示了如何根据不同编码方案计算并总结它们各自的数值范围。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值