PC_定点数_模+补码表示+补码相关性质

🎈🎈🎈🎈补码🎈🎈🎈🎈🎈

  • 补码(英语:2’s complement
    • 补数(complement)

补码&补数&模

在这里插入图片描述如上分析,负数求补码的时候,手工求模的一种方式就是:只需要加上一个模即可(不限于二进制)

  • 一个负数可以用它的正补数来代替,这个正补数:(可以用模加上负数本身求得这个正补数)。(当然,默认的,负数的绝对值不超过模,否则对其进行取模运算,然后将的到的结果执行上述操作,下文一样)
  • 一个正数和一个负数互为补数时,它们绝对值之和即为模数。
  • 正数的补数即该正数本身。
    将补数的概念用到计算机中,便出现了补码这种机器数。

由真值手算补码:

  • 对于二进制数求补码,我们有更高效的方法

    • 对真值 x < 0 x<0 x<0二进制原码形式 T ( x ) T(x) T(x)数值位部分各位取反后再加1即可)
      • 简称为原码数值位取反加一操作,记为 C ( x ) C(x) C(x)操作
    • 补码之所以有利于加减法的统一,是因为,求补码的手段可以通过对原码各个数值位取反加一;
    • 而对于手算补码,可以采用 C ( x ) C(x) C(x)(但是仅限于对二进制数有效)
    • 另外,真值 x ⩾ 0 x\geqslant{0} x0时,没有上述规律,也不需要执行 C ( x ) C(x) C(x)操作
  • 也可以通过补码的形式化定义,可以采用手工二进制减法来计算负数的补码

    • 注意机器寄存器位数(机器字长),可能需要补0对齐),

补码的形式化定义

  • complement(补码)

  • 基于寄存器字长rbs=(1+n)的划分结构:

    • rbs:register bits
  • 以下公式中的x均为真值

纯整数:

  • C ( x ) = [ x ] 补 = { x , 0 ⩽ x < 2 n 2 n + 1 + x = 2 n + 1 − ∣ x ∣ , − 2 n ⩽ x ⩽ 0 ( m o d 2 n + 1 ) C(x)=[x]_补= \begin{cases} x,&0\leqslant{x}<2^n \\ 2^{n+1}+x=2^{n+1}-|x|,&-2^{n}\leqslant{x}\leqslant{0} \end{cases} \quad (mod\quad 2^{n+1}) \\ C(x)=[x]={x,2n+1+x=2n+1x,0x<2n2nx0(mod2n+1)

  • 根据前面的模&补数的分析,这里的公式(x<=0)的情况的公式就好理解,

    • 这里的模是$ 2^{n+1}$而不是 2 n 2^{n} 2n;就是负数加模(模+负数)
  • x 1 = + 1010 x 2 = − 1101 字长为 8 , n = 8 − 1 = 7 ( 7 位数值位 ) n + 1 = 8 ( 恰好等于字长 ) C ( x 1 ) = x 1 = 0 , 1010000 ( 补齐数值位到 8 − 1 = 7 位 ) C ( x 2 ) = x 2 = 2 8 + x = 2 8 − ∣ x ∣ = 1   0000   0000 − 1101 = 10000000 + 10000000 − 1101 = 2 7 + 2 7 − ( 2 4 − 1 − 2 ) = 2 7 + 2 2 ⋅ 2 5 − ( 2 4 − 1 − 2 ) = 2 7 + 2 2 ⋅ 2 5 − ( 2 4 − 2 0 − 2 1 ) = 2 7 + 3 ⋅ 2 5 + ( 2 5 − 2 4 ) + 2 1 + 2 0 = 2 7 + 3 ⋅ 2 5 + ( 2 ⋅ 2 4 − 2 4 ) + 2 1 + 2 0 = 2 7 + 3 ⋅ 2 5 + 2 4 + 2 1 + 2 0 = 1 , 1110011 x_1=+1010 \\x_2=-1101 \\ 字长为8,n=8-1=7(7位数值位) \\n+1=8(恰好等于字长) \\ C(x_1)=x_1=0,1010000(补齐数值位到8-1=7位) \\ C(x_2)=x_2=2^{8}+x=2^8-|x|=1\ {0000}\ {0000}-1101 \\=10000000+10000000-1101 \\=2^7+2^7-(2^4-1-2) \\=2^7+2^2\cdot{2^5}-(2^4-1-2) \\=2^7+2^2\cdot{2^5}-(2^4-2^0-2^1) \\=2^7+3\cdot{2^5}+(2^5-2^4)+2^1+2^0 \\=2^7+3\cdot{2^5}+(2\cdot2^4-2^4)+2^1+2^0 \\=2^7+3\cdot{2^5}+2^4+2^1+2^0 \\=1,1110011 x1=+1010x2=1101字长为8,n=81=7(7位数值位)n+1=8(恰好等于字长)C(x1)=x1=0,1010000(补齐数值位到81=7)C(x2)=x2=28+x=28x=1 0000 00001101=10000000+100000001101=27+27(2412)=27+2225(2412)=27+2225(242021)=27+325+(2524)+21+20=27+325+(22424)+21+20=27+325+24+21+20=1,1110011

纯小数

  • C ( x ) = [ x ] 补 = { x , 0 ⩽ x < 1 2 + x = 2 − ∣ x ∣ , − 1 ⩽ x < 0 ( m o d 2 ) C(x)=[x]_{补}= \begin{cases} x,&0\leqslant{x}<1 \\ 2+x=2-|x|,&-1\leqslant{x}<0 \end{cases} \quad (mod\quad 2 ) C(x)=[x]={x,2+x=2x,0x<11x<0(mod2)

  • x 1 = + 0.1001 x 2 = − 0.0110 机器字长为 8 b i t 求上述两个真值的补码 解 : n = 8 − 1 = 7 C ( x 1 ) = x 1 = 0 , 1001000 C ( x 2 ) = 2 + x 2 = 2 − 0.0110 = 1.0000000 + ( 1.0000000 − 0.0110000 ) = 1.1010000 x_1=+0.1001 \\ x_2=-0.0110 \\ 机器字长为8bit \\求上述两个真值的补码 \\解: n=8-1=7 \\ C(x_1)=x_1=0,1001000 \\ C(x_2)=2+x_2=2-0.0110=1.0000000+(1.0000000-0.0110000)=1.1010000 x1=+0.1001x2=0.0110机器字长为8bit求上述两个真值的补码:n=81=7C(x1)=x1=0,1001000C(x2)=2+x2=20.0110=1.0000000+(1.00000000.0110000)=1.1010000

表示范围

  • 纯整数补码可以表示的(真值)范围:

    • 设字长为 n + 1 ( 1 : 符号位 1 位 , n : 数值位位数 ) − 2 n ⩽ x ⩽ 2 n − 1 设字长为n+1(1:符号位1位,n:数值位位数) \\ -2^n\leqslant{x}\leqslant{2^n-1} 设字长为n+1(1:符号位1,n:数值位位数)2nx2n1

      • 共有 s = 2 n − 1 − ( − 2 n ) + 1 = 2 n + 1 共有s=2^n-1-(-2^n)+1=2^{n+1} 共有s=2n1(2n)+1=2n+1个数

        • 恰好可以表示 2 字长 2^{字长} 2字长个数
        • ( 但是最大的数只有 2 字长 − 1 − 1 ) (但是最大的数只有2^{字长-1}-1) (但是最大的数只有2字长11)
      • 比原码可以多表示一个数 原码由于占用了两个编码来表示 0 , 补码仅占用了一个 , 所有的不同编码充分用来表示不同的数 ( 多表示一个下限值 ( 约定原码中的负 0 ( 10..000 表示 − 2 n ) ) ) 比原码可以多表示一个数 \\原码由于占用了两个编码来表示0,补码仅占用了一个, \\所有的不同编码充分用来表示不同的数 \\(多表示一个下限值(约定原码中的负0(10..000表示-2^{n}))) 比原码可以多表示一个数原码由于占用了两个编码来表示0,补码仅占用了一个,所有的不同编码充分用来表示不同的数(多表示一个下限值(约定原码中的负0(10..000表示2n)))

🎈补码基本性质:补码和相反数的关系

  • 真值相反数的补码等于真值补码的相反数
  • 🎈根据某个数的补码求其相反数的补码

求证 : [ − B ] 补 = − [ B ] 补 求证:[-B]_{补}=-[B]_{补} 求证:[B]=[B]

  • 在补码减法公式那里有:

  • [ A − B ] 补 = [ A ] 补 + [ − B ] 补 [A-B]_{补}=[A]_{补}+[-B]_{补} [AB]=[A]+[B]

  • 我们只需要令A=B

    • KaTeX parse error: Invalid size: 'B' at position 31: …{补}+[-B]_{补}\\ [̲B̲]̲_{补}+[-B]_{补}=0…
  • 前面还提到, [ − B ] 补 [ -B]_{补} [B] [ B ] 补 [B]_{补} [B]连同符号位在内,每位取反,末位加1

  • 对于整数:

    • 如果 : [ B ] 补 = b 0 , b 1 b 2 ⋯ b n ; ( b i ∈ {   0 , 1   } ; b i ⩽ 1 ) 那么 : [ − B ] 补 = b 0 ‾ , b 1 ‾   b 2 ‾   ⋯   b n ‾ + 1 ; 其中 b 0 b 1 b 2 ⋯ b 3 是 0 / 1 串 ( b 0 ) 是符号位 ; B 是真值 , 而且正负都适用 ; 如果:[B]_补=b_0,b_1b_2\cdots b_n; (b_i\in\set{0,1};b_i\leqslant{1}) \\ 那么:[-B]_补=\overline{b_0},\overline{b_1}\ \overline{b_2}\ \cdots \ \overline{b_n}+1; \\其中b_0b_1b_2\cdots b_3是0/1串 \\(b_0)是符号位; \\B是真值,而且正负都适用; 如果:[B]=b0,b1b2bn;(bi{0,1};bi1)那么:[B]=b0,b1 b2  bn+1;其中b0b1b2b30/1(b0)是符号位;B是真值,而且正负都适用;

      • KaTeX parse error: Invalid size: '-B' at position 79: …}}_{n个1} \\ \\ [̲-̲B̲]̲_补=2^n-B=(2^n-1…
  • 对于小数依然成立

    • C ( x ) = y 0 . y 1 y 2 ⋯ y n 则 C ( − x ) = y 0 ‾ . y 1 ‾   y 2 ‾ ⋯ y n ‾ + 2 − n C(x)=y_0.y_1y_2\cdots{y_n} \\则 \\ C(-x)=\overline{y_0}.\overline{y_1}\ \overline{y_2}\cdots{\overline{y_n}}+2^{-n} C(x)=y0.y1y2ynC(x)=y0.y1 y2yn+2n

      • 即 , 由 C ( x ) 求 C ( − x ) , 可以通过将符号位在内 , 每一位 b i t 取反末尾再加 1 得到 即,由C(x)求C(-x),可以通过将符号位在内,每一位bit取反末尾再加1得到 ,C(x)C(x),可以通过将符号位在内,每一位bit取反末尾再加1得到

        • 在补码减法运算中常用
      • 利用上述结论 , 可以省去过渡到原码的步骤 , 在已知 x 的补码的情况下 , 可以直接求解 C ( − x ) 利用上述结论,可以省去过渡到原码的步骤,在已知x的补码的情况下,可以直接求解C(-x) 利用上述结论,可以省去过渡到原码的步骤,在已知x的补码的情况下,可以直接求解C(x)

      • 由补码求原码,可以对补码再次求补,即可得到原码

        • 可以通过补码的形式化(公式)定义得到
        • 一般将寄存器中保存的有符号机器数做如下划分(划分位1+n)
    • 推导

      • 分为正负两种情况;

        • 已知 C ( y ) , 求 C ( − y ) 仅讨论纯小数 设真值 y 的补码 C ( y ) = y 0 . y 1 y 2 ⋯ y n c a s e s 1 : ( y 0 = 0 ) 即 : C ( y ) = 0. y 1 y 2 ⋯ y n 真值 y = + 0. y 1 y 2 ⋯ y n − y = − 0. y 1 y 2 ⋯ y n C ( − y ) = 1. y 1 ‾   y 2 ‾ ⋯ y n ‾ + 2 − n c a s e s 1 : ( y 0 = 1 ) 即 : C ( y ) = 1. y 1 y 2 ⋯ y n 真值 y = − 0. y 1 y 2 ⋯ y n − y = + 0. y 1 y 2 ⋯ y n C ( − y ) = 0. y 1 ‾   y 2 ‾ ⋯ y n ‾ + 2 − n 已知C(y),求C(-y) \\仅讨论纯小数 \\ 设真值y的补码C(y)=y_0.y_1y_2\cdots{y_n} \\ cases1:(y_0=0) \\即:C(y)=0.y_1y_2\cdots{y_n} \\ 真值y=+0.y_1y_2\cdots{y_n} \\-y=-0.y_1y_2\cdots{y_n} \\C(-y)=1.\overline{y_1}\ \overline{y_2}\cdots{\overline{y_n}}+2^{-n} \\\\ cases1:(y_0=1) \\即:C(y)=1.y_1y_2\cdots{y_n} \\ 真值y=-0.y_1y_2\cdots{y_n} \\-y=+0.y_1y_2\cdots{y_n} \\C(-y)=0.\overline{y_1}\ \overline{y_2}\cdots{\overline{y_n}}+2^{-n} 已知C(y),C(y)仅讨论纯小数设真值y的补码C(y)=y0.y1y2yncases1:(y0=0):C(y)=0.y1y2yn真值y=+0.y1y2yny=0.y1y2ynC(y)=1.y1 y2yn+2ncases1:(y0=1):C(y)=1.y1y2yn真值y=0.y1y2yny=+0.y1y2ynC(y)=0.y1 y2yn+2n

🥽补码问题示例

分别用原码,补码和移码表示浮点数

  • 设浮点数格式为 : 阶码 5 位 ( 含 1 位阶符 ) , 尾数 11 位 ( 含 1 位数符 ) 设浮点数格式为 : 阶码 5 位 ( 含 1 位阶符 ) , 尾数 11 位 ( 含 1 位数符 ) 设浮点数格式为:阶码5(1位阶符),尾数11(1位数符)

  • 写出 51 128 , − 27 1024 , 7.375 , − 86.5 所对应的机器数 . 要求如下 写出 \frac{51}{128},-\frac{27}{1024}, 7.375 ,- 86.5所对应的机器数.要求如下 写出12851,102427,7.375,86.5所对应的机器数.要求如下
    (1):源码
    (2):补码
    (3):移码

  • 共四组 ( 1 ) ( 2 ) ( 3 ) , 分别对应于 x 1 , x 2 , x 3 , x 4 的解答 : 共四组(1)(2)(3),分别对应于x_1,x_2,x_3,x_4的解答: 共四组(1)(2)(3),分别对应于x1,x2,x3,x4的解答:

在这里插入图片描述

🎈🧧补码与真值的转换

  • 记号说明:

    • 设真值 x 的原码为 T ( x ) 设真值x的原码为T(x) 设真值x的原码为T(x)
    • x 取补码后得到 C ( x ) x取补码后得到C(x) x取补码后得到C(x)
  • 老规矩,先分析正负

    • 如果给定的原码是以下集中情况,则判定为负数

      • -开头的十进制数🎋
      • 1开头的进制数
      • 8 ∼ F 8\sim{F} 8F开头的十六进制
    • 否则给定的数就是正数,属于最简单的情况,原码补码反码三码相等,真值的二进制形式就是原码的符号位0改为+号

      • 根据需要可以吧二进制数转为十进制数
    • 对于真值为负数的 x ( < 0 ) , 假设给定的串是 C ( x ) : 对于真值为负数的x(<0),假设给定的串是C(x): 对于真值为负数的x(<0),假设给定的串是C(x):

      • 保留符号位 1 , 后续的数值位每位取反在加 1 , 即可得到 x 的原码 T ( x ) , 符号位 1 改为 − 号 , 得到 x 的真值 保留符号位1,后续的数值位每位取反在加1,即可得到x的原码T(x),符号位1改为-号,得到x的真值 保留符号位1,后续的数值位每位取反在加1,即可得到x的原码T(x),符号位1改为,得到x的真值
  • 在C语言打印变量值的时候,经常需要从给定的补码计算出对应的

  • 补码和原码其实互为补码!(无论正负都可以这么说)

    • 对 C ( x ) 再次执行取补码操作 ( C ( C ( x ) ) ) 得到 T ( x ) 对C(x)再次执行取补码操作(C(C(x)))得到T(x) C(x)再次执行取补码操作(C(C(x)))得到T(x)

    • 即:

      • T ( x ) = C ( C ( x ) ) C ( x ) = C ( T ( x ) ) T(x)=C(C(x)) \\ C(x)=C(T(x)) T(x)=C(C(x))C(x)=C(T(x))

补码中的0只有一种表示形式?

  • 或者说,真值0的补码只有一种形式
  • 下面的实例说明,真值0(+0-0)的补码形式是一致的

    • x = 0 时 : 不强调字长 , 则统计数值位整数位数 : 取 n = 4 C ( + 0.0000 ) = 0.0000 C ( − 0.0000 ) = 2 10 + ( − 0.0000 ) 2 = 10.000 0 2 − 0.000 0 2 = 0.0000 ( 由于是单符号位 , 最高位 1 被舍弃 , 符号位为 0 ( 双符号位则另外考虑 ) ) x=0时: \\ 不强调字长,则统计数值位整数位数: \\取n=4 C(+0.0000)=0.0000 \\ C(-0.0000)=2_{10}+(-0.0000)_{2}=10.0000_2-0.0000_2=0.0000 \\(由于是单符号位,最高位1被舍弃,符号位为0(双符号位则另外考虑)) x=0:不强调字长,则统计数值位整数位数:n=4C(+0.0000)=0.0000C(0.0000)=210+(0.0000)2=10.000020.00002=0.0000(由于是单符号位,最高位1被舍弃,符号位为0(双符号位则另外考虑))
  • 对于机器数(补码),符号是参加运算的,数值位的加法进位会进位到符号位,因为进位而超过机器字长的部分将会被丢弃,从而产生了和模的效果

  • 对于+0,视为正数处理,即补码和原码一致,都是全0

  • -0的真值可以通过形式化定义的公式来求(临界情况)

双符号位(变形补码)

  • 即,寄存器字长以rbs=2+n划分符号位和数值位,那么对于整数

补码小数

  • 变形补码 , 又称为模 4 补码 ( m o d    4 ) 双符号位的补码小数定义为 : D C ( x ) = [ x ] 补 = { x , 0 ⩽ x < 1 4 + x = 4 − ∣ x ∣ , − 1 ⩽ x < 0 ( m o d    4 ) 变形补码,又称为模4补码(\mod 4) \\双符号位的补码小数定义为: \\ DC(x)=[x]_补= \begin{cases} x,&0\leqslant{x}<1 \\4+x=4-|x|,&-1\leqslant{x}<0 \end{cases} (\mod{4}) \\ 变形补码,又称为模4补码(mod4)双符号位的补码小数定义为:DC(x)=[x]={x,4+x=4x,0x<11x<0(mod4)

整数

  • [ x ] 补 双符号位 = 2 寄存器位数 + x = 2 2 + n + x = 2 2 + n − ∣ x ∣ , x < 0 , [x]_{补_{双符号位}}=2^{寄存器位数}+x=2^{2+n}+x \\ =2^{2+n}-|x|,x<0, [x]双符号位=2寄存器位数+x=22+n+x=22+nx,x<0,

− 128 -128 128相关问题

  • 按照前讲的,如果考虑符号位的话,8位数是不够表示带符号位的真值-128的

  • -128的(真值)绝对值的二进制表示为:1000,0000
    考虑符号位,岂不是1,1000,0000?

  • 然而,对于8位字长的限制下,补码可以表示到-128

  • 原码的1000,0000表示负0(8位有符号数原码表示不了-128)
    而补码中0就是0000,0000(空出来的-0(1,000,0000)被用于表示最小负数(最大绝对值负数)

🎞🎞附:wikipedia中补码相关介绍

补码 (英语:2’s complement)是一种用二进制表示有符号数的方法,也是一种将数字的正负号变号的方式,常在计算机科学中使用。

补码以有符号比特(符号位)的二进制数定义。

  • 正数和0的补码就是该数字本身(绝对值(或者说视为无符号值)的二进制形式)再补上最高比特0。> * 负数的补码则是将其对应正数==按位取反再加1==。(注意,是先确定其对应的正数(原码)取反(连通符号位都取反)再加一(意味着严格<0的数的补码符号位(最高位)会是1)
  • 补码系统的最大优点是可以在加法减法处理中,不需因为数字的正负而使用不同的计算方式。
  • 只要一种加法电路就可以处理各种有号数加法,而且减法可以用一个数加上另一个数的补码来表示,
  • 因此只要有加法电路补码电路即可完成各种有号数加法及减法,在电路设计上相当方便
  • 另外,补码系统的0就只有一个表示方式,这和反码系统不同(在反码系统中,0有二种表示方式),因此在判断数字是否为0时,只要比较一次即可。

右侧的表是一些8-bit补码系统的整数。

1646031456989

它的可表示的范围包括-128到127,总共256(= $ 2^{8}$ )个整数。

  • 我们说,补码表示法中,真值0的补码表示法的形式只有一种(0,0…0)(对应于原码表示法中的正零;
  • 除0之外的其它的数是一一对应,补码中(1,0…0)被空出来了(即原码中表示的负零的那个码在补码体系中对应的真值是多少?
  • 它可以表示给定机器字长的最小(负)整数(表示范围中的下限)

特别的补码

有两个数字的补码等于本身:

  • 一个是0
  • 另一个为该比特内可表示有符号位区分的二进制形式的下界负数(即1000…形式的补码值)。
  • 国外介绍的反码系统和国内教材介绍的有所区别
    在这里插入图片描述

补码的工作原理

1646041398552

  • 所以模256下的加减法,用0, 1, 2,…, 254,255表示其值,或者用−128, −127,…, −1, 0, 1, 2,…,127是完全等价的。
  • −128与128,−127与129,…,−2与254,−1与255可以互换而加减法的结果不变。
  • 从而,把8位(octet)的高半部分(即二进制的1000 0000到1111 1111)解释为−128到−1,
  • 同样也实现了模256的加减法,而且所需要的CPU加法运算器的电路实现与8位无符号整数并无不同。

实际上对于8比特的存储单元,把它的取值[00000000,…, 11111111]解释为[0, 255],或者[-1, 254],或者[-2, 253],或者[-128, 127],或者[-200, 55],甚至或者[500, 755],对于加法硬件实现并无不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值