真值 机器码 原码 反码 补码

部署运行你感兴趣的模型镜像
在计算机中,数都是以补码的形式存在,运算也都是以补码进行运算。补码有两个优点:一个是能够计算减法,另外一个就是统一正零和负零。

 二进制数与十进制数一样有正负之分。在计算机中,常采用数的符号和数值一起编码的方法来表示数据。常用的有原码、反码、补码、移码等。这几种表示法都将数据的符号数码化。为了区分一般书写时表示的数和机器中编码表示的数,我们称前者为真值,后者为机器数或机器码。

1. 原码表示法

原码表示法是一种比较直观的表示方法,其符号位表示该数的符号,正用“0”表示,负用“1”表示;而数值部分仍保留着其真值的特征。

定点小数的原码形式为 x. xx… xn ,则原码表示的定义是:

[]
{
       10

1-=1+|| 0-1

式中[]是机器数,是真值

例如,=+0.1001,则[]=0.1001

   x=-0.1001,则[]=1.1001

定点整数的原码形式为 x0 xx… xn,则原码表示的定义是:

[]
{
        2n0

2n=2n+|| 0-2n

原码表示法有两个特点:

零的表示有“+ 0”和“- 0”之分,故有两种形式:

[+ 0] = 0.000…0

[- 0] = 1.000…0

符号位 x0 的取值由下式决定:

0

{
0        0

0

原码表示法的优点是比较直观、简单易懂,但它的最大缺点是加法运算复杂。这是因为,当两数相加时,如果是同号则数值相加;如果是异号,则要进行减法。而在进行减法时,还要比较绝对值的大小,然后减去小数,最后还要给结果选择恰当的符号。显然,利用原码作加减法运算是不太方便的。为了解决这些矛盾,人们找到了补码表示法。

2. 补码表示法

由于计算机的运算受一定字长的限制,属于有模运算,所以,在计算机中可以使用补码进行计算。在定点小数机器中数最大不超过1,也就是负的小数对“1”的补码是等价的。但实际上,负数的符号位还有一个“1”,要把它看成数的一部分,所以要对2求补码,也就是以2为模数。

定点小数的补码形式为x. xx… xn ,则补码表示的定义是:

[]
{
       10

2+=2-|| 0-1

(mod 2)

对于0,在补码情况下只有一种表示形式,即

[+ 0] = [- 0] = 0.000…0

对于定点整数 x0 xx… xn,补码表示的定义是:

[]
{
         2n0

2n+1+=2n+1-|| 0-2n

(mod 2n+1)

采用补码表示法进行减法运算就比原码方便多了。因为不论数是正还是负,机器总是做加法,减法运算可变成加法运算。但根据补码定义,正数的补码与原码形式相同,而求负数的补码要减去|x|。为了用加法代替减法,结果还得在求补码时作一次减法,这显然是不方便的。从下面介绍的反码表示法中可以获得求负数补码的简便方法,解决负数的求补问题。

3. 反码表示方法

反码表示法中,符号的表示法与原码相同。正数的反码与正数的原码形式相同;负数的反码符号位为1,数值部分通过将负数原码的数值部分各位取反(0变1,1变0)得到。

定点小数的反码形式为x. xx… xn ,则反码表示的定义是: 

[]
{
      10

(2-2-n)+ 0-1

对于0,在反码情况下只有两种表示形式,即

[+ 0] = 0.000…0

[- 0] = 1.111…1

对于定点整数 x0 xx… xn ,反码表示的定义是:

[]
{
         2n0

(2n+1-1)+x       0-2n

我们分别比较小数与整数的反码与补码的公式可得到:

[ x]补 = [x]反 + 2 -n         (0 > x ≥ -1)

[ x]补 = [ x]反 + 1         (0 > x ≥ -2 -n)

这就是通过反码求补码的重要公式。这两个公式告诉我们,若要一个负数变补码,其方法是符号位置 1,其余各位取反,然后在最末位上加 1 

4. 移码表示法

移码通常用于表示浮点数的阶码。阶码是个n位的整数,假定定点整数移码形式为x0 xx… xn 时,移码的定义是:

[]=2n  2n-2n

由移码的定义式可知,对于同一个整数,其移码与其补码数值位完全相同,而符号位正好相反。

在上面所述的数据四种机器表示法中,移码表示法主要用于表示浮点数的阶码。由于补码表示对加减运算十分方便,因此目前机器中广泛采用补码表示法。在这类机器中,数用补码表示,补码存储,补码运算。也有些机器,数用原码进行存储和传送,运算时改用补码。还有些机器在做加减法时用补码运算,在作乘法时用原码运算。


您可能感兴趣的与本文相关的镜像

GPT-SoVITS

GPT-SoVITS

AI应用

GPT-SoVITS 是一个开源的文本到语音(TTS)和语音转换模型,它结合了 GPT 的生成能力和 SoVITS 的语音转换技术。该项目以其强大的声音克隆能力而闻名,仅需少量语音样本(如5秒)即可实现高质量的即时语音合成,也可通过更长的音频(如1分钟)进行微调以获得更逼真的效果

### 原码反码补码和移码的定义 #### 定义说明 原码是一种最简单的二进制表示方法,其特点是符号位明确区分正负数。对于正数,符号位为`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、付费专栏及课程。

余额充值