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} x⩾0时,没有上述规律,也不需要执行 C ( x ) C(x) C(x)操作
- 对真值
x
<
0
x<0
x<0的二进制原码形式
T
(
x
)
T(x)
T(x)数值位部分各位取反后再加1即可)
-
也可以通过补码的形式化定义,可以采用手工二进制减法来计算负数的补码
- 注意机器寄存器位数(机器字长),可能需要补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+1−∣x∣,0⩽x<2n−2n⩽x⩽0(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=8−1=7(7位数值位)n+1=8(恰好等于字长)C(x1)=x1=0,1010000(补齐数值位到8−1=7位)C(x2)=x2=28+x=28−∣x∣=1 0000 0000−1101=10000000+10000000−1101=27+27−(24−1−2)=27+22⋅25−(24−1−2)=27+22⋅25−(24−20−21)=27+3⋅25+(25−24)+21+20=27+3⋅25+(2⋅24−24)+21+20=27+3⋅25+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=2−∣x∣,0⩽x<1−1⩽x<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=8−1=7C(x1)=x1=0,1001000C(x2)=2+x2=2−0.0110=1.0000000+(1.0000000−0.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:数值位位数)−2n⩽x⩽2n−1
-
共有 s = 2 n − 1 − ( − 2 n ) + 1 = 2 n + 1 共有s=2^n-1-(-2^n)+1=2^{n+1} 共有s=2n−1−(−2n)+1=2n+1个数
- 恰好可以表示 2 字长 2^{字长} 2字长个数
- ( 但是最大的数只有 2 字长 − 1 − 1 ) (但是最大的数只有2^{字长-1}-1) (但是最大的数只有2字长−1−1)
-
比原码可以多表示一个数 原码由于占用了两个编码来表示 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]_{补} [A−B]补=[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,b1b2⋯bn;(bi∈{0,1};bi⩽1)那么:[−B]补=b0,b1 b2 ⋯ bn+1;其中b0b1b2⋯b3是0/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.y1y2⋯yn则C(−x)=y0.y1 y2⋯yn+2−n
-
即 , 由 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.y1y2⋯yncases1:(y0=0)即:C(y)=0.y1y2⋯yn真值y=+0.y1y2⋯yn−y=−0.y1y2⋯ynC(−y)=1.y1 y2⋯yn+2−ncases1:(y0=1)即:C(y)=1.y1y2⋯yn真值y=−0.y1y2⋯yn−y=+0.y1y2⋯ynC(−y)=0.y1 y2⋯yn+2−n
-
-
🥽补码问题示例
分别用原码,补码和移码表示浮点数
-
设浮点数格式为 : 阶码 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} 8∼F开头的十六进制
-
否则给定的数就是正数,属于最简单的情况,原码补码反码三码相等,真值的二进制形式就是原码的符号位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.00002−0.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=4−∣x∣,0⩽x<1−1⩽x<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+n−∣x∣,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补码系统的整数。
它的可表示的范围包括-128到127,总共256(= $ 2^{8}$ )个整数。
- 我们说,补码表示法中,真值0的补码表示法的形式只有一种(0,0…0)(对应于原码表示法中的
正零
; - 除0之外的其它的数是一一对应,补码中(1,0…0)被空出来了(即原码中表示的
负零
的那个码在补码体系中对应的真值是多少? - 它可以表示给定机器字长的最小(负)整数(表示范围中的下限)
特别的补码
有两个数字的补码等于本身:
- 一个是0
- 另一个为该比特内可表示
有符号位区分的
二进制形式的下界负数
(即1000…形式的补码值)。 国外介绍的反码系统和国内教材介绍的有所区别
补码的工作原理
- 所以模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],
对于加法硬件实现
并无不同。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2021-11-10 RGB_打开/获取颜色选择器(RGB)的几种方式/本地RGB查询/css颜色名参考