PC_机器数_定点负数的原码_补码_反码在结构上的关系

预备知识

模2范畴内的取反

  • KaTeX parse error: Undefined control sequence: \set at position 27: …,我们有规律: \\ y\in\̲s̲e̲t̲{0,1} \\ 1-y=\b…

  • KaTeX parse error: Undefined control sequence: \set at position 27: …,我们有规律: \\ y\in\̲s̲e̲t̲{0,1} \\ 1+y= \…

    • 例 如 : 真 值 x < 0 原 码 T ( x ) = 1. x 1 x 2 ⋯ x n ( 小 数 点 前 面 的 1 表 示 符 号 位 为 负 号 ) 反 码 A ( x ) = 1. x 1 ‾   x 2 ‾ ⋯ x n ‾ 补 码 C ( x ) = A ( x ) + 2 − n = 1. x 1 ‾   x 2 ‾ ⋯ x n ‾ + 2 − n 例如:真值x<0 \\原码T(x)=1.x_1x_2\cdots{x_n} \\(小数点前面的1表示符号位为负号) \\反码A(x)=1.\overline{x_1}\ \overline{x_2}\cdots{\overline{x_n}} \\补码C(x)=A(x)+2^{-n}=1.\overline{x_1}\ \overline{x_2}\cdots{\overline{x_n}}+2^{-n} :x<0T(x)=1.x1x2xn(1)A(x)=1.x1 x2xnC(x)=A(x)+2n=1.x1 x2xn+2n

    • KaTeX parse error: Undefined control sequence: \set at position 228: …line{x_m};(m\in\̲s̲e̲t̲{1,\cdots,n}) \…

    • 例 如 : A ( x ) = 0.1111 C ( x ) = A ( x ) + 2 − 4 = 0.1111 + 0.0001 = 1.0000 可 见 x 1 ⋯ x 4 所 有 b i t 看 起 来 都 被 取 反 了 ( 最 极 端 的 进 位 连 锁 反 应 ) 此 处 m = 1 例如:A(x)=0.1111 \\C(x)=A(x)+2^{-4}=0.1111+0.0001=1.0000 \\可见x_1\cdots{x_4}所有bit看起来都被取反了(最极端的进位连锁反应) \\此处m=1 :A(x)=0.1111C(x)=A(x)+24=0.1111+0.0001=1.0000x1x4bit()m=1

    • 又 比 如 T ( x ) = 0.01100 A ( x ) = 0.10011 C ( x ) = A ( x ) + 2 − 5 = 0.10011 + 0.00001 = 0.10100 此 处 m = 3 记 C ( x ) = 0. x 1 x 2 x 3 x 4 x 5 可 以 看 到 x 的 补 码 C ( x ) 的 x 1 x 2 位 置 和 x 的 原 码 x 1 x m − 1 位 置 的 数 码 一 致 ( x 1 ⋯ x m − 1 ) ( m = 3 ) x m ⋯ x n 和 x 的 原 码 的 x m ⋯ x n 是 一 致 的 ( m = 3 , n = 5 ) 又比如 T(x)=0.01100 \\ A(x)=0.10011 \\ C(x)=A(x)+2^{-5}=0.10011+0.00001=0.10100 \\此处m=3 \\记C(x)=0.x_1x_2x_3x_4x_5 \\可以看到x的补码C(x)的x_1x_2位置和x的原码 \\x_1x_{m-1}位置的数码一致(x_1\cdots{x_{m-1}})(m=3) \\x_m\cdots{x_n}和x的原码的x_m\cdots{x_n}是一致的(m=3,n=5) T(x)=0.01100A(x)=0.10011C(x)=A(x)+25=0.10011+0.00001=0.10100m=3C(x)=0.x1x2x3x4x5xC(x)x1x2xx1xm1(x1xm1)(m=3)xmxnxxmxn(m=3,n=5)

证明二进制补码规律

  • 用 C ( x ) 表 示 x 的 补 码 ; 用C(x)表示x的补码; C(x)x;

    • 证 明 C ( − x ) = − C ( x ) 证明C(-x)=-C(x) C(x)=C(x)

      • 当 x > 0 当x>0 x>0

        • KaTeX parse error: Undefined control sequence: \set at position 579: …ine{x_i}(x_i\in\̲s̲e̲t̲{0,1}) \end{ali…

          • 由 于 二 进 制 ( 模 2 ) , x + 2 = 2 + x ≡ x m o d    2 ; − C ( x ) = − x =   − 0. x 1 x 2 ⋯ x n ≡ 2 − 0. x 1 x 2 ⋯ x n ( m o d    2 ) = 1 + ( 1 − 0. x 1 x 2 ⋯ x n ) = 1 + 0. x 1 ‾   x 2 ‾ ⋯ x n ‾ + 2 − n = 1. x 1 ‾   x 2 ‾ ⋯ x n ‾ + 2 − n 可 见 C ( − x ) = − C ( x ) = 1. x 1 ‾   x 2 ‾ ⋯ x n ‾ + 2 − n 由于二进制(模2),x+2=2+x\equiv x\mod{2}; \\-C(x)=-x=\ -0.x_1x_2\cdots{x_n} \equiv{2-0.x_1x_2\cdots{x_n}}(\mod{2}) \\=1+(1-0.x_1x_2\cdots{x_n}) \\=1+0.\overline{x_1}\ \overline{x_2}\cdots{\overline{x_n}}+2^{-n} \\=1.\overline{x_1}\ \overline{x_2}\cdots{\overline{x_n}}+2^{-n} \\\\ 可见C(-x)=-C(x)=1.\overline{x_1}\ \overline{x_2}\cdots{\overline{x_n}}+2^{-n} (2),x+2=2+xxmod2;C(x)=x= 0.x1x2xn20.x1x2xn(mod2)=1+(10.x1x2xn)=1+0.x1 x2xn+2n=1.x1 x2xn+2nC(x)=C(x)=1.x1 x2xn+2n
        • 类似的可以证明 x < 0 x<0 x<0的情况

模k同余

  • x ≡ y m o d    k 或 写 作 : x ≡ y ( m o d   k ) 表 达 的 是 : ( x − y ) % k = 0 ( 这 不 同 于 : x % k = y % k , 比 如 4.1 − 2.1 % ≡ 2 ( m o d   2 ) ) x\equiv{y}\mod{k} \\或写作:x\equiv{y}(\mathrm{mod}\ k) \\表达的是: (x-y)\%k=0 \\(这不同于:x\%k=y\%k,比如4.1-2.1\%\equiv2(\mathrm{mod}\ 2)) xymodk:xy(mod k):(xy)%k=0(:x%k=y%k,4.12.1%2(mod 2))

🎈负数的补码与原码和反码在二进制串的结构上的关系

  • 补码的左右移位的填补规则依赖于如下规律

  • 下面仅讨论定点小数的情况,整数的情况手法类似,结论适用

  • 对于 x < 0 x<0 x<0;

    • 机器字长为n+1;符号位占走1位,有n位留给数值位

    • 原码 T ( x ) = 1. x 1 x 2 ⋯ x m ⋯ x n T(x)=1.x_1x_2\cdots{x_m}\cdots{x_n} T(x)=1.x1x2xmxn

      • 假设从低位到高位观察T(x)的小数部分,第一个值为1的位值出现在 x m x_m xm这个位置上

      • 换句话说,如果没有精度/机器字长补齐要求,那么 x m + 1 ⋯ x n x_{m+1}\cdots{x_n} xm+1xn这部分的小数位都是0,它们可以不写

    • 反 码 C 1 ( x ) = 1. x 1 ‾   x 2 ‾ ⋯ x m ‾ ⋯ x n ‾   反码C_1(x)=1.\overline{x_1}\ \overline{x_2} \cdots{\overline{x_m}}\cdots{\overline{x_n}\ } C1(x)=1.x1 x2xmxn 

      • 1. x 1 ‾   x 2 ‾ ⋯ x m ‾ ⋯ x n ‾   = 1. x 1 ‾   x 2 ‾ ⋯ x m − 1 ‾ 0 ▲ 1 ⋯ 11 ⏟ x m + 1 ‾ ⋯ x n ‾ 1.\overline{x_1}\ \overline{x_2} \cdots{\overline{x_m}}\cdots{\overline{x_n}\ } =1.\overline{x_1}\ \overline{x_2} \cdots{\overline{x_{m-1}}}\underset\blacktriangle{0} \underbrace{1\cdots{11}}_{\overline{x_{m+1}}\cdots\overline{x_n}} 1.x1 x2xmxn =1.x1 x2xm10xm+1xn 111
    • 补码 C ( x ) = c 0 . c 1 ⋯ c n = x 0 . c 1 ⋯ c n C(x)=c_0.c_1\cdots{c_n}=x_0.c_1\cdots{c_n} C(x)=c0.c1cn=x0.c1cn:

      • $$
        C(x)
        =C_1(x)+2^{-n}
        =1.\overline{x_1}\ \overline{x_2}
        \cdots{\overline{x_{m-1}}}\underset\blacktriangle{0}
        \underbrace{1\cdots{11}}{\overline{x{m+1}}\cdots\overline{x_n}}
        +2^{-n}
        \=1.\overline{x_1}\ \overline{x_2}
        \cdots{\overline{x_{m-1}}}\underset\blacktriangle{1}
        \underbrace{{0}\cdots{00}}{\overline{x{m+1}}\cdots\overline{x_n}}

        $$

    • 🎈可见, x m x_m xm是无论是 T ( x ) 还 是 C ( x ) T(x)还是C(x) T(x)C(x)

      • 从低位开始向高位扫描的过程中最早出现的码值1都是同一个位置( x m x_m xm)出
    • 🎈同时:

      • 我们把真值x的补码C(x)的数值位分为两部分:

        • c 1 ⋯ c m − 1 = x 1 ‾   x 2 ‾ ⋯ x m − 1 ‾ c_1\cdots{c_{m-1}}=\overline{x_1}\ \overline{x_2}\cdots \overline{x_{m-1}} c1cm1=x1 x2xm1
          • 即,这部分和反码相同
          • A = c 1 ⋯ c m − 1 A=c_1\cdots{c_{m-1}} A=c1cm1
        • c m ⋯ c n { c_m}\cdots{c_n} cmcn= x m ⋯ x n x_m\cdots{x_n} xmxn
          • 部分和原码相同
          • B = c m ⋯ c n B=c_m\cdots{c_n} B=cmcn
      • casesA:如果真值二进制数值位部分没有1(全为0),那么这种情况下,真值 x = 0 x=0 x=0

        • 实际上这种情况 ( x = 0 ) (x=0) (x=0)已经不是负数的范畴,仅作为回顾
        • T ( x ) = ± 1.0 ⋯ 0 T(x)=\pm1.0\cdots{0} T(x)=±1.00
        • A ( x ) = ± 1.1 ⋯ 1 A(x)=\pm1.1\cdots{1} A(x)=±1.11
        • C ( x ) = 0.0 ⋯ 0 C(x)=0.0\cdots{0} C(x)=0.00
        • 可以看到,这种情况下,补码数值位部分的各个bit和原码的数值位部分一致!
        • 这类情况属于极端情况
          • m<0或m>n,都属于这类情况
          • 可以理解为 A 的 长 度 是 0 , B 的 长 度 为 n : A的长度是0,B的长度为n: A0,Bn:
      • casesB:否则,真值的数值位二进制数码表示中有1

        • 即, m ∈ [ 1 , n ] m\in[1,n] m[1,n]

        • m ⩽ 1 时 , 无 论 x 的 正 负 , 补 码 和 原 码 具 有 一 样 的 形 式 ( C ( x ) = T ( x ) ) m\leqslant{1}时,无论x的正负,补码和原码具有一样的形式(C(x)=T(x)) m1,x,(C(x)=T(x))

          • 这种情况下可以在分为两种具体情况:
            • m = 0 m=0 m=0
              • m = 0 m=0 m=0要和符号位区分开来,意思是数值位最高位到最低位全部为0
              • C ( x ) = x 0 . 0 ⋯ 00 ; x = 0 C(x)=x_0.0\cdots{00};x=0 C(x)=x0.000;x=0(定点小数)
                • C ( x ) = x 0 , 0 ⋯ 0 ; x = 0 C(x)=x_0,0\cdots0;x=0 C(x)=x0,00;x=0(定点整数)
            • m = 1 m=1 m=1
              • 意思是数值位最高位为1,其余数值位全为0
              • C ( x ) = x 0 . 10 ⋯ 00 C(x)=x_0.10\cdots{00} C(x)=x0.1000, x = ± 1 2 x=\pm\frac{1}{2} x=±21
                • C ( x ) = x 0 , 10 ⋯ 00 C(x)=x_0,10\cdots{00} C(x)=x0,1000, x = ± 2 n − 1 , n 是 数 值 位 位 数 x=\pm{2^{n-1}},n是数值位位数 x=±2n1,n
        • m ⩾ n + 1 m\geqslant{n+1} mn+1

          • 这种情况归为casesA
    • 🎈上面两个结论对于 x > 0 x>0 x>0的是时候也显然是成立的(因为 x > 0 x>0 x>0时,原码补码反码一致!)

高位部分

  • 一般的,我们对补码 C ( x ) C(x) C(x)所对应的真值大小比较感兴趣
    • 这关乎到溢出判断和规格化操作的判断
  • 然而体现数的大小,主要看从高位比较到低位
  • 🎄下面的讨论比较啰嗦,个人认为上面的讨论更加有品位,而且更加体现概率统计的习惯
  • 根据上述结论,数值位第一位开始到第m-1位 x 1 ⋯ x m − 1 x_1\cdots{x_{m-1}} x1xm1这部分是x的反码A(x)相同
    • 对这部分每位取反,即可得到原码在这部分位置的取值(也就是高位小数位的取值)
  • 设: C ( x ) = x 0 . x 1 ⋯ x n C(x)=x_0.x_1\cdots{x_n} C(x)=x0.x1xn
    • x 1 ⋯ x n x_1\cdots{x_n} x1xn至少有一个bit取1( x ≠ 0 x\neq{0} x=0)
      • x 1 = 0 x_1=0 x1=0
        • x 2 ⋯ x n 中 至 少 有 一 个 1 x_2\cdots{x_n}中至少有一个1 x2xn1
          • T ( x ) = x 0 . 1 ⋯   , ∣ x ∣ ⩾ 1 2 T(x)=x_0.1\cdots,|x|\geqslant{\frac{1}{2}} T(x)=x0.1,x21
      • x 1 = 1 x_1=1 x1=1
        • x 2 ⋯ x n x_2\cdots{x_n} x2xn至少有一个bit取1
          • T ( x ) = x 0 . 0 ⋯   ; ∣ x ∣ < 1 2 T(x)=x_0.0\cdots;|x|<\frac{1}{2} T(x)=x0.0;x<21
        • 否则
          • T ( x ) = C ( x ) = x 0 . 10 ⋯ 00 ; ∣ x ∣ = 1 2 T(x)=C(x)=x_0.10\cdots{00};|x|={\frac{1}{2}} T(x)=C(x)=x0.1000;x=21
    • x 1 ⋯ x n x_1\cdots{x_n} x1xn全部取0, x = 0 x=0 x=0

  • 将小数 x x x的小数数值部分,从高位到低位分别编为 x 1 ⋯ x n x_1\cdots{x_n} x1xn
    • KaTeX parse error: Undefined control sequence: \set at position 16: x_i代指第i位小数,i\in\̲s̲e̲t̲{1,2,\cdots{,n}…
    • x = x 0 . x 1 ⋯ x n x=x_0.x_1\cdots{x_n} x=x0.x1xn
  • x = − 0.11011 , 小 数 位 数 为 n = 5 ; x=-0.11011,小数位数为n=5; x=0.11011,n=5;
    • 最 低 位 的 1 出 现 在 m = 5 ( 即 x 5 ) 处 最低位的1出现在m=5(即x_5)处 1m=5(x5)
    • 原码 T ( x ) = 1.11011 T(x)=1.11011 T(x)=1.11011
    • 补码 C ( x ) = 1.00100 + 2 − 5 = 1.00100 + 0.00001 = 1.00101 C(x)=1.00100+2^{-5}=1.00100+0.00001=1.00101 C(x)=1.00100+25=1.00100+0.00001=1.00101
  • x = − 0.01 ⋯   , 小 数 点 尾 数 大 于 2 , 小 于 等 于 n x=-0.01\cdots,小数点尾数大于2,小于等于n x=0.01,2,n
    • T ( x ) = 1.01 ⋯ T(x)=1.01\cdots T(x)=1.01
    • C ( x ) = 1.1 ⋯ C(x)=1.1\cdots C(x)=1.1
      • 根据上面的规律(同一个真值x的原码和补码和反码在结构上的关联:)
        • m ⩾ 2 m\geqslant{2} m2
        • 设 C ( x ) = x 0 , b 1 b 2 ⋯ b n 设C(x)=x_0,b_1b_2\cdots{b_n} C(x)=x0,b1b2bn
        • C ( x ) 的 最 低 位 1 应 该 出 现 在 第 m 位 小 数 ( x m = 1 ) C(x)的最低位1应该出现在第m位小数(x_m=1) C(x)1m(xm=1)
        • 更重要的是,同时有 b 1 ⋯ b m + 1 = x 1 ‾ ⋯ x m − 1 ‾ b_1\cdots{b_{m+1}}=\overline{x_1}\cdots{\overline{x_{m-1}}} b1bm+1=x1xm1
          • 本例中, m ⩾ 2 m\geqslant{2} m2,那么 m − 1 ⩾ 1 m-1\geqslant{1} m11
          • 随意,至少能够保证 b 1 = x 1 ‾ b_1=\overline{x_1} b1=x1,即 b 1 = 1 b_1=1 b1=1
          • 从而,得到 C ( x ) = 1.1 ⋯ C(x)=1.1\cdots C(x)=1.1的断言

允许移位(正确移位)的条件

  • 讨论在什么情况下移位不会导致数据丢失而发生错误

补码

  • 左移:
    • 当符号位和最高数据位一致的时候,进行补码左移1位不会操作数据丢失
      • 可以分类讨论
      • 也可以反方向讨论:
        • x ≠ 0 x\neq{0} x=0:
          • 只有在真值 x 的 最 高 位 有 效 数 据 位 不 会 丢 失 的 左 移 , 对 应 补 码 的 左 移 行 为 x的最高位有效数据位不会丢失的左移,对应补码的左移行为 x,
          • x = x 0 , x 1 x 2 ⋯ x=x_0,x_1x_2\cdots x=x0,x1x2
            • x 1 = 1 时 , 左 移 1 b i t 会 发 生 错 误 x_1=1时,左移1bit会发生错误 x1=1,1bit(丢失高位数据)
            • x 1 = 0 时 , 左 移 1 b i t 不 会 导 致 关 键 数 据 丢 失 x_1=0时,左移1bit不会导致关键数据丢失 x1=0,1bit(类似于对非规格化数做一次左归操作)
              • 这种情况下,对应到补码的移动,需要讨论正负两种大类情况
                • x 0 = 0 x_0=0 x0=0
                  • 即 x = + 0.01... ; C ( x ) = T ( x ) = 0.01 ⋯ 即x=+0.01...;C(x)=T(x)=0.01\cdots x=+0.01...;C(x)=T(x)=0.01
                  • 可见, x 1 = 0 x_1=0 x1=0
                • x 0 = 1 x_0=1 x0=1
                  • x = − 0.01... ; C ( x ) = 1.1 ⋯ x=-0.01...;C(x)=1.1\cdots x=0.01...;C(x)=1.1
                  • 可见, x 1 = 1 x_1=1 x1=1
          • 可见,当真值x不为0时,符号位和最高数据位一致的时候,进行补码左移1位不会操作数据丢失
        • x = 0 时 , C ( x ) 中 , x 1 对 应 为 0 x=0时,C(x)中,x_1对应为0 x=0,C(x),x10
          • 由于x=0,所以左移位操作丢失0不会造成错误
        • 综 上 , 只 要 C ( x ) = c 0 . c 1 ⋯ 满 足 c 0 = c 1 , 那 么 左 移 1 位 不 会 造 成 错 误 综上,只要C(x)=c_0.c_1\cdots满足c_0=c_1,那么左移1位不会造成错误 ,C(x)=c0.c1c0=c1,1

两数相加进位规律

  • 两个n位数相加,结果位数不超过n+1位

    • 推导

    • x + y ⩽ ∣ x + y ∣ ⩽ ∣ x ∣ + ∣ y ∣ 两 个 最 大 的 n 位 r 进 制 数 的 求 和 结 果 : 记 q = r − 1 ( 就 是 表 示 最 大 的 数 码 ) 例 如 : 如 果 r = 10 ( 十 进 制 ) , 那 么 q = 9 ) 最 小 n 位 数 : r n − 1 = 1 0 ⋯ 00 ⏟ n − 1 个 0 ⏞ n 位 数 最 大 的 n 位 数 : r n − 1 = q ⋯ q q ⏟ n 个 q 最 小 n + 1 位 数 : r n 例 如 n = 2 , 10 和 99 分 别 是 最 小 2 位 数 和 最 大 两 位 数 2 个 最 大 n 位 数 相 加 : A = ( r n − 1 ) + ( r n − 1 ) = 2 ( r n − 1 ) 最 大 n 位 数 的 r 倍 B = r ( r n − 1 ) = q ⋯ q q ⏟ n 个 q 0 ( A < B ) 最 小 n + 2 位 数 : C = r n + 1 C B = r ( r n − 1 ) 2 ( r n − 1 ) = r 2 容 易 知 道 , 当 r ⩾ 2 时 : B ⩽ C 从 而 A < B ⩽ C , 即 A < C 因 此 , 两 个 n 位 数 相 加 , 位 数 无 法 达 到 n + 2 位 , 最 多 达 到 n + 1 位 x+y\leqslant|x+y|\leqslant|x|+|y| \\ 两个最大的n位r进制数的求和结果: \\记q=r-1(就是表示最大的数码) \\例如:如果r=10(十进制),那么q=9) \\最小n位数:r^{n-1}=\overbrace{1\underbrace{0\cdots{00}}_{n-1个0}}^{n位数} \\最大的n位数:r^n-1=\underbrace{q\cdots{qq}}_{n个q} \\最小n+1位数:r^n \\ \\例如n=2,10和99分别是最小2位数和最大两位数 \\ \\2个最大n位数相加: \\A=(r^n-1)+(r^n-1)=2(r^n-1) \\最大n位数的r倍 \\B=r(r^n-1)=\underbrace{q\cdots{qq}}_{n个q}0 \\(A<B) \\最小n+2位数: \\C=r^{n+1} \\\frac{C}{B}=\frac{r(r^n-1)}{2(r^n-1)} =\frac{r}{2} \\容易知道,当r\geqslant2时:B\leqslant{C} \\从而A<B\leqslant{C},即A<C \\因此,两个n位数相加,位数无法达到n+2位,最多达到n+1位 x+yx+yx+ynr:q=r1():r=10(),q=9)n:rn1=1n10 000 nn:rn1=nq qqqn+1:rnn=2,109922n:A=(rn1)+(rn1)=2(rn1)nrB=r(rn1)=nq qqq0(A<B)n+2:C=rn+1BC=2(rn1)r(rn1)=2r,r2:BCA<BC,A<C,n,n+2,n+1

二进制数其他规律

posted @   xuchaoxin1375  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示