二进制数据的原码.补码.反码

注意: 原码,补码,反码 都是针对二进制的操作。

原码

其英文翻译为Signed Magnitude(数值) Representation是一种有符号数值的表现方式,使用二进制的最高位来表示符号,其余位表示数值。

最高位为符号位,其数值意义如下

  • 0:表示证书
  • 1:表示负数

例如:假设用8位也即1byte来表示数字21

(21)10=(0001  0101)2(21)_{10} = (0001 \ \ 0101)_2

可以看到最高位为0,表示正数


那么-21的二进制如下,其最高位为1表示负数

(21)10=(1001  0101)2(-21)_{10} = (1001 \ \ 0101)_2

原码 = 符号位 + 数值位

原码 = 最高位 + 数值位


接下来,看一个有意思的现象;能够看到 -21149的原码一模一样。

(149)10=(1001  0101)2(149)_{10} = (1001 \ \ 0101)_{2}

如你所见,149-21 的二进制原码表示都是 10010101。这正是原码表示法的一个问题:原码无法唯一确定一个数的符号和数值。在这种情况下,仅看二进制数本身,无法区分 149-21

为了有效区分正负数和避免二义性,计算机通常采用补码表示法,因为补码可以唯一确定每个整数的符号和数值,并且能够更好地处理算术运算。

反码

反码(One’s Complement)是一种用于表示有符号整数的二进制编码方式。

  • 负数的反码是将原码的符号位保持不变,然后将其余位逐位取反

  • 正数的反码与其二进制原码相同。

假设我们用4个bit 表示-4,其反码是对应正数的二进制位逐位取反

通过上图你能够得到一个结果就是 原码和反码的和即1 1 1 1 也即4个bit 的最大值[0 ~15].

反码的局限性之一是 +0 == 0 0 0 0-0 == 1 1 1 1 ,我们知道 正零和负零都是零,常规来说我们没有对0添加符号的做法。所以引入补码的概念

补码

首先,抛出概念:补码(Two’s Complement)是计算机中广泛使用的有符号整数表示方法,它解决了原码和反码的一些问题,如正负零的歧义和复杂的加减运算。补码的主要优点是能简化整数运算的实现,并且只有一种零表示。

概念比较晦涩难懂,你可以借用"南辕北辙"的经典故事,在人类已知的物理或者化学世界里,所有的事务都是有边界的,宇宙,时间,光线这种科学边界,暂不在我们考虑范畴之内.

你从地球上某个经纬度,沿着任意方向,假设你可以一致走,最终你还能回到这个经纬度上。

正数的 原码 反码 补码都是一样的。

我们知道-0的反码是1111,补码为其反码+11 0000,但因为刚才我们假设是4个bit,所以最高位的1被忽略,因此补码为0000


使用 8 位二进制数据表示 21-21 时,可以分别用原码反码补码三种方式来表示。

  • 21 的 8 位二进制表示为:

    • 原码:00010101
    • 反码:00010101
    • 补码:00010101
  • -21 的 8 位二进制表示为:

    • 原码:10010101
    • 反码:11101010 —符号位不变,其余位取反
    • 补码:11101011 —反码+1 == 补码

所以在计算进中进行计算的话,都是通过补码来操作,比如 21-21=0,就等于 21 + (-21) = 0

+0001 0101++1110 1011+1111 1111\begin{aligned} &\phantom{+} 0001\ 0101 \\ + &\phantom{+} 1110\ 1011 \\ \hline &\phantom{+} 1111\ 1111 \\ \end{aligned}


二进制数据的原码.补码.反码
https://jackiedai.github.io/2024/08/30/012进制/002.原码补码反码/
Author
lingXiao
Posted on
August 30, 2024
Licensed under