[学习笔记] 关于原码与补码

二进制原码:
最高位为符号位,最高位为0时表示正数,为1时表示负数,如:

1111 1111 = -127 ; 0111 1111 = 127

此时称为原码(true form),但原码不能直接参与运算,如:

1000 0001 = -1
0000 0001 = 1
-1 + 1 = 1000 0001 + 0000 0001 = 1000 0010 = -2 
1
2
3
这显然是错误的,此外可以发现原码中有两种0: 
0000 0000 = +0 ; 1000 0000 = -0

因此计算机中采用补码(complement)来表示有符号整数。

首先引出模的概念:
模为一个计量系统的计数范围。如时钟的表示范围为00:00:00 – 11:59:59,故时钟的模为12:00:00。有模的计量器均可以化减法为加法,如若想从10点调整到6点,既可以倒拨4个小时,也可以正拨8个小时。

Byte型数据有8位,则不考虑符号时,其能表示的最大数值为1111 1111(255),+1后为1 0000 0000,最高位溢出,归零。故byte型数据的模则为256(2828)

补码的定义:
对于正整数来说,原码即补码;
对于负整数来说,其补码与其绝对值的原码相加,和为模(2n2n);
补码中0的表示方法只有一种:0000 0000;
强制规定原码的-0(仅最高位为1,其他位全为0)的值为最小的负数,即−2(n−1)−2(n−1)。如byte型数据中,1000 0000 = -128(−27−27);
补码再求补码,等于该整数本身;
补码的计算:
对于正整数,原码即补码;
对于负整数,补码的求法为取其绝对值的二进制,按位取反后+1,即求得其补码。如以byte型数据为例,求-7的补码: 
先取得7的二进制:0000 0111 = 7
按位取反: 1111 1000
再加1:1111 1001 即为-7的补码
对负数求补码的算法的代数证明:
由补码定义可知,一个负整数的补码与其绝对值的原码(由于是正数,即为补码),和为模。对于一个n位的二进制数来说,模为2n2n。

设一个负数A−A−,其二进制原码为 1 kn−2 kn−3 … k1 k01 kn−2 kn−3 … k1 k0,则其绝对值A+A+的二进制原码/补码为 0 kn−2 kn−3 … k1 k00 kn−2 kn−3 … k1 k0。其十进制的值即为: 
A+=0∗2n−1+kn−2∗2n−2+kn−3∗2n−3+ ... +k1∗21+k0∗20
A+=0∗2n−1+kn−2∗2n−2+kn−3∗2n−3+ ... +k1∗21+k0∗20
按照负整数补码求法,要将其绝对值的原码/补码先按位取反再+1(AC=∼A++1AC=∼A++1)。对于二进制来说,每一位非0即1,即使当前位为未知的x,按位取反也可用(1-x)表示。则A+A+按位取反后二进制为1 (1−kn−2) (1−kn−3) … (1−k1) (1−k0)1 (1−kn−2) (1−kn−3) … (1−k1) (1−k0),十进制表示方法为:

∼A+=1∗2n−1+(1−kn−2)∗2n−2+(1−kn−3)∗2n−3+ ... +(1−k1)∗21+(1−k0)∗20=(2n−1+2n−2+ ... +20) − (2n−2∗kn−2+2n−3∗kn−3+ ... +21∗k1+20∗k0)=2n−1−A+⇒(∼A++1)+A+=2n⇒AC+A+=2n
∼A+=1∗2n−1+(1−kn−2)∗2n−2+(1−kn−3)∗2n−3+ ... +(1−k1)∗21+(1−k0)∗20=(2n−1+2n−2+ ... +20) − (2n−2∗kn−2+2n−3∗kn−3+ ... +21∗k1+20∗k0)=2n−1−A+⇒(∼A++1)+A+=2n⇒AC+A+=2n
即该负整数的补码与其绝对值的原码/补码相加等于模,完全符合补码的定义。证毕!

求原码:
对于正整数,原码即补码;
对于负整数,最高位为符号位,保持为1不变,其他位按位取反+1,即求得补码;
--------------------- 
作者:水蓝城城主 
来源:CSDN 
原文:https://blog.csdn.net/mrliuzhao/article/details/79769280 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(FPGA)