二进制补码、小数的补码及运算规则
原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示
法在数值前面增加了一位符号位(即最高位为符号位):正数该位为 0,负数该
位为 1(0 有两种表示:+0 和-0),其余位表示数值的大小。
补码(two's complement) 1、在计算机系统中,数值一律用补码来表示(存
储)。 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也
可按加法来处理。另外,两个用补 码表示的数相加时,如果最高位(符号位)
有进位,则进位被舍弃。 2、补码与原码的转换过程几乎是相同的。
一:整数的补码
1:求补码
1.1 正数的补码=原码 (就是其自身)
1.2 负数的补码=原码取反,最低位+1,符号位不变 (8bit 数值范围:-128~127, 0x10000000 对
应-128)
Decimal
Two's complement
127
64
1
0
−1
−64
−127
−128
0111 1111
0100 0000
0000 0001
0000 0000
1111 1111
1100 0000
1000 0001
1000 0000
2:补码对应的数值
2.1 正数的补码对应的数值直接计算
2.2 负数的补码对应的数值符号位不变,补码取反+1.
(补码取反+1=其绝对值,也叫真值)
3:补码的运算
[X+Y]补 = [X]补 + [Y]补
[X-Y]补 = [X]补 - [Y]补 = [X]补 + [-Y]补
例:-7-(-10) [十进制]
-7 的补码:11111001
-10 的补码:11110110
-(-10):按位取反再加 1 实际上就是其负值的补码,为 00001010
-7 - (-10)= -7 + 10 = 3
11111001+00001010 = 00000011
转换成十进制为 3
【X*Y】补=【X】补×【Y】补,即乘数(被乘数)相乘的补码等于补码的相乘。
Notes: 特别需要注意,需要做符号扩展:Nbit 乘数 和 Nbit 被乘数 都符号扩展到 2Nbit,再直
接相乘即可。
The product of two N-bit numbers requires 2N bits to contain all possible
values. If the precision of the two two's-complement operands is doubled
before the multiplication, direct multiplication (discarding any excess bits
beyond that precision) will provide the correct result. For example, take
6 × −5 = −30. First, the precision is extended from 4 bits to 8. Then the
numbers are multiplied, discarding the bits beyond 8 (shown by 'x'):
00000110
× 11111011
(6)
(−5)
==========
110
1100
00000
110000
1100000
11000000
110000000
1100000000
==========
10111100010
(−30)
二:小数 Fraction 的补码 (这里针对 FSL DSP 中的 Fraction)
小数 Fraction: 最高位为符号位,小数点就在符号位之后,其后的第一位为 1/2,再后一位为 1/4,
再其后 1/8,1/16… 依此类推
正小数的补码=原码
负小数的补码=原码取反,最低位+1,符号位不变 1.111 负(.000+1) = - 1/8
0.100 0.5
小数补码的乘法:符号扩展,直接相乘,结果左移一位(小数相乘后,需要左移一位)
SC3850_CRM_RevB.pdf B-545
1)符号扩展,直接相乘
0000 2000(Hex) * FFFF C000(Hex) = 1FFFF8000000(Hex)
2) 结果左移 1 位
1FFFF8000000(Hex) <<1 = 3FFFF0000000 (Hex)
3) 取最低 32 位,(这个例子中前面是符号扩展)
=F000 0000