已知原码求原码对应的补码以及补码的实际意义
众所周知,在计算机中表示数据时是使用二进制表示法,因此在计算机内部表示数值数据时并不是使用我们平时常用的十进制表示方法,而是对应的二进制位模式。例如,十进制的15用8位二进制位模式表示就是00001111;在计算机内部表示数据使用原码表示码时会使用一位符号位再加数值位表示数字信息,其中符号位“0”代表正数,而“1”代表负数。
计算机最初是用来进行数值计算的科学仪器,由于二进制的加法较为简单易行,在电路设计的实现上会比较简单,但是要进行减法的计算时和十进制就会有很大的差异。
以十进制的8-5为例:
00001000 —— 8
10000101 —— - 5
8-5即8+(-5),但是由于二进制原码表示法的特殊性,这样的数值计算不能用原来的规则,因此我们需要新的数值表示方法。这也正是补码表示法的现实意义所在。
- 示例
在讲二进制补码表示法之前,可以先理解一下补码的内涵:
假设有一个时钟显示时间是5:00,但是我们想让它显示3:00,因此我们可以将时针顺时针旋转10格或者逆时针旋转2格,如果我们规定顺时针方向为正方向的话,可以表示为+10=-2。为什么可以这样表示呢?因为时钟表示小时的刻度只有12个,12个为一个周期,那么我们将12作为“模”。于是+10=-2+12-12,由于加一个模减一个模都是一次周期性的变化,所以并不会造成数值的结果变化。
启示:负数可以用补码表示法表示,把减法转化为加法
正数的补码即为其本身,负数的补码是原负数加上模。
用通用表达式表示整数补码就是:
[X]补 | X的范围 |
---|---|
0,[X] | 2(n-1)>X>=0 |
2n+X=2n-X | 0>x>=-2(n-1)(mod 2n) |
用通用表达式表示小数(浮点数)补码就是:
[X]补 | X的范围 |
---|---|
X | 1>X>=0 |
2+X=2-|X| | 0>x>=-1 |
其中n代表n位位模式表示的数值,mod表示取模运算,M位字长的整数的模值为2M
-
已知[X]补求[-X]补(求机器负数):
连同符号位一起取反,末位加1(如果在加法过程中,最高一位超过了字长,即产生了溢出,则舍弃) -
拓展:变形补码:
为了便于判断运算结构是否发生了溢出,某些计算机采用双符号位的补码表示法,因为这种方法小数模数都是4,因此也称作模4补码。
在这里:负整数的补码为:[X]补=2n+1-X;
负小数的补码为:[X]补=4+X,