跳转至

定点数加法

加减运算

对于补码来说,无论加法还是减法,最后都会转变成加法,由加法器实现运算,符号位也参与运算。

设机器字长为8位(含一位符号位), A=15, B=-24, 求[A+B]补和[A-B]补

                  原码           补码
A = +1111    ->  00001111    -> 00001111
B = -11000   ->  10011000    -> 11101000
-B = +11000  ->  00011000    -> 00011000

[A+B]补 = 00001111 + 11101000 = 11110111
                                原码 10001001  -9

[A-B]补 = 00001111 + 00011000 = 00100111
                                原码 00100111   39

溢出

C = 124  求 [A+C]补

[A+C]补 = 00001111 + 01111100 = 10001011   真值 -117 溢出

因为 8位的补码的可表示范围为[-128, 2^8-1], 所以上述A+C 溢出了

判断溢出

1. 采用一位符号位,根据符号位判断

2. 采用一位符号位,根据进位位情况判断

符号位的进位 Cs 最高位的进位C1
上溢 0 1
下溢 1 0
即Cs和C1不同时有溢出

3. 采用双符号位

正数符号位00,负数符号位11

[A+C]补 = 00,0001111 + 00,1111100 = 01,0001011 上溢
[B-C]补 = 11,1101000 + 11,0000100 = 10,1101100 下溢

符号位的第一位为运算结果正确的符号位,符号位的第二位是运算实际的运算结果符号

记两个符号位为S1S2, 则V = S1 ^ S2, 若V=0,表示无溢出; 若V=1,表示有溢出

实际存储时只存储一个符号位,运算时会复制一个符号位


双符号位的补码又称: 模4补码

单符号位的补码又称: 模2补码

溢出避免

符号扩展

短数据->长数据. int -> long

多出来的怎么填补?

冀ICP备17031746号-6