如上分析,负数求补码的时候,手工求模的一种方式就是:只需要加上一个模即可(不限于二进制)
正补数来代替,这个正补数:(可以用模加上负数本身求得这个正补数)。(当然,默认的,负数的绝对值不超过模,否则对其进行取模运算,然后将的到的结果执行上述操作,下文一样)对于二进制数求补码,我们有更高效的方法
原码数值位取反加一操作,记为
C
(
x
)
C(x)
C(x)操作也可以通过补码的形式化定义,可以采用手工二进制减法来计算负数的补码
complement(补码)
基于寄存器字长rbs=(1+n)的划分结构:
以下公式中的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]_补= {x,0⩽x<2n2n+1+x=2n+1−|x|,−2n⩽x⩽0
根据前面的模&补数的分析,这里的公式(x<=0)的情况的公式就好理解,
C
(
x
)
=
[
x
]
补
=
{
x
,
0
⩽
x
<
1
2
+
x
=
2
−
∣
x
∣
,
−
1
⩽
x
<
0
(
m
o
d
2
)
C(x)=[x]_{补}= {x,0⩽x<12+x=2−|x|,−1⩽x<0
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个数
比原码可以多表示一个数 原码由于占用了两个编码来表示 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
前面还提到,
[
−
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是真值,而且正负都适用;
对于小数依然成立
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)
由补码求原码,可以对补码再次求补,即可得到原码
推导
分为正负两种情况;
设浮点数格式为 : 阶码 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的解答:

记号说明:
老规矩,先分析正负
如果给定的原码是以下集中情况,则判定为负数
-开头的十进制数🎋1开头的进制数否则给定的数就是正数,属于最简单的情况,原码补码反码三码相等,真值的二进制形式就是原码的符号位0改为+号
对于真值为负数的 x ( < 0 ) , 假设给定的串是 C ( x ) : 对于真值为负数的x(<0),假设给定的串是C(x): 对于真值为负数的x(<0),假设给定的串是C(x):
在C语言打印变量值的时候,经常需要从给定的补码计算出对应的
补码和原码其实互为补码!(无论正负都可以这么说)
对 C ( x ) 再次执行取补码操作 ( C ( C ( x ) ) ) 得到 T ( x ) 对C(x)再次执行取补码操作(C(C(x)))得到T(x) 对C(x)再次执行取补码操作(C(C(x)))得到T(x)
即:
下面的实例说明,真值0(+0和-0)的补码形式是一致的
对于机器数(补码),符号是参加运算的,数值位的加法进位会进位到符号位,因为进位而超过机器字长的部分将会被丢弃,从而产生了和模的效果
对于+0,视为正数处理,即补码和原码一致,都是全0
-0的真值可以通过形式化定义的公式来求(临界情况)
rbs=2+n划分符号位和数值位,那么对于整数按照前讲的,如果考虑符号位的话,8位数是不够表示带符号位的真值-128的
-128的(真值)绝对值的二进制表示为:1000,0000
考虑符号位,岂不是1,1000,0000?
然而,对于8位字长的限制下,补码可以表示到-128
原码的1000,0000表示负0(8位有符号数原码表示不了-128)
而补码中0就是0000,0000(空出来的-0(1,000,0000)被用于表示最小负数(最大绝对值负数)
补码 (英语:2’s complement)是一种用二进制表示有符号数的方法,也是一种将数字的正负号变号的方式,常在计算机科学中使用。
补码以有符号比特(符号位)的二进制数定义。
正数和0的补码就是该数字本身(绝对值(或者说视为无符号值)的二进制形式)再补上最高比特0。> * 负数的补码则是将其对应正数==按位取反再加1==。(注意,是先确定其对应的正数(原码)取反(连通符号位都取反)再加一(意味着严格<0的数的补码符号位(最高位)会是1)加法电路及补码电路即可完成各种有号数加法及减法,在电路设计上相当方便。右侧的表是一些8-bit补码系统的整数。

它的可表示的范围包括-128到127,总共256(= $ 2^{8}$ )个整数。
正零;负零的那个码在补码体系中对应的真值是多少?有两个数字的补码等于本身:
有符号位区分的二进制形式的下界负数(即1000…形式的补码值)。国外介绍的反码系统和国内教材介绍的有所区别

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