整数的表示
无符号整数
无符号整数按道理来说没有补码
无符号数的减法直接减,借位减,最高位比如0-1的情况,不管,假装向前借了1位,所以最高位的0-1结果是1
无符号的减法还有一种解释,在计算机内部,无符号数的加减法等同于补码进行加减法,只是最后对于结果的解释不一样,例如
unsigned A, B;
A = 0;
B = 1;
A - B;
int A, B;
A = 0;
B = 1;
A - B;
提示
两种情况计算的结果都是,A-B进行的其实是[A]补−[B]补,就是[0]补−[1]补 = 00000000H + FFFFFFFFH = FFFFFFFFH,但是解释不同:
- 对于无符号的来说,结果就是
FFFFFFFFH; - 对于有符号的来说,结果
FFFFFFFFH是补码,转换成真值就是-1。
有符号整数
定点数的编码表示
定点数的编码表示
补码
{0,x,0≤x<2n2n+1+x=2n+1−∣x∣,−2n≤x<0
若字长为n+1,表示范围为−2n≤x≤2n−1
| 原码 | 补码 | 十进制 |
|---|
| 0,0000000 | 0,0000000 | 0 |
| 0,1111111 | 0,1111111 | 27−1=127 |
| 1,0000001 | 1,1111111 | 1 |
| 1,1111110 | 1,0000001 | −(27−1)=−127 |
| 溢出 | 1,0000000 | -128 |
| 1,0000000 | 0,0000000 | -0 |
补码表示与真值的关系
设一个二进制整数补码有n+1位(含1位符号位xn),即
[x]补=xnxn−1xn−2…x1x0
其补码表示的真值为
x=−2nxn+i=0∑n−12ixi
由此可以得出一个推论,即补码的高位扩展符号位,其值不变,例如补码1,1的值等于1,11,1,111,以此类推1,1111...11都一样,证明如下:
令
f(w)f(w+1)=xnxn−1xn−2…x1x0=xnxnxn−1xn−2…x1x0
下面我们证明f(w)=f(w+1)
按照补码表示与真值的关系,进行展开
f(w)f(w+1)=−2nxn+i=0∑n−12ixi=−2n+1xn+2nxn+i=0∑n−12ixi=−2nxn+i=0∑n−12ixi
故可以得到f(w)=f(w+1)
结论的应用
借助这个结论我们可以很方便的求一些补码的值,例如补码1,1111111,根据结论等于1,1,很显然对应的原码为1,1,同时也可以按照补码的定义进行展开,则其值为−21+20=−1,二者是等价的
移码
补码=补码符号取反结果,但是补码实际上的定义是真值+偏置值
补码的移位操作
算术移位
- 正数的补码在移位时,空位添 0
- 负数的补码左移时,低位添 0;右移时高位添 1
证明
我们可以从补码关系式展开的角度来看,例如对于f(w)=xnxn−1xn−2…x1x0,左移一位结果为f(w+1)=xnxn−1…x1x00
f(w)f(w+1)⟹=−2nxn+i=1∑n−12ixi=−2n+1xn+2i=0∑n−12ixif(w+1)=2f(w)
对应的右移一位,则f′(w)=x′xnxn−1xn−2…x1,即
f′(w)=−2nx′+2n−1xn+21i=1∑n−12ixi
显然,此时若不考虑溢出,则f(w)=2f′(w),故对应的x′=xn
此时
f′(w)=−2nx′+2n−1xn+21i=1∑n−12ixi=−2nxn+2n−1xn+…=−2n−1+21i=1∑n−12ixi=21f(w)
即补码左移时,低位补 0,右移时,高位应该补符号位,即负数补1,正数 补 0
示例
- 例如对于补码
1,100(-4),右移一位对应的是1,110(-2),左移一位是1,000(-8),即若没有溢出正好就是 2 倍的关系 - 对于补码
1,011(-5),右移一位对应1,101(-3),左移一位是0110(溢出)