补码加减法运算和溢出判断
在二进制计算中,如果计算结果超过计算机的位数,就会发生溢出。
设机器字长为 8
位(包括一位符号位),A = 15
,B = -24
,C = 124
,求 [A+B]补
、[A-B]补
、[A+C]补
、[B-C]补
将十进制数转换成二进制机器数
- [A]原 = 00001111,[A]补 = 00001111
- [B]原 = 10011000,[B]补 = 11101000
- [C]原 = 01111100,[C]补 = 01111100
[A+B]补 = [A]补 + [B]补 = 00001111 + 11101000 = 11110111
,得到 [A+B]补 = 11110111
转换成真值为 -9
,和用十进制计算 A+B
的结果一样。减法运算,是先把它变成加法运算,然后用补码的进行加法运算,计算第二个式子:
[A-B]补 = [A]补 + [-B]补 = 00001111 + 00011000 = 00100111
,得到 [A-B]补 = 00100111
转换成真值为 39
,和用十进制计算 A-B
的结果是一样的。加法运算和减法运算在计算机内部都是加法运算,只是对于减法运算来说,多了一个求相反数的电路:
B
-> -B
溢出判断 两个机器数,进行了加减运算后,得到的结果和十进制数加减运算后的结果不一致,这就造成了溢出
[A+C]补 = [A]补 + [C]补 = 00001111 + 01111100 = 10001011
,真值是-11
,十进制A+C
真值是139
[B-C]补 = [B]补 + [-C]补 = 11101000 + 10000100 = 01101100
,真值是108
,十进制B-C
真值是-148
- 采用一位符号位
- 采用一位符号位和数据位进位
- 采用双符号位
假设被加数的符号位为
As
,加数的符号位为 Bs
,结果位的符号位为 Ss
将符号位进行异或运算:
V = AsBs!Ss ⊕ !As!BsSs
- 异或运算的原理是相同得到
0
,不同得到1
- 如果
V = 0
,表示无溢出 - 如果
V = 1
,表示有溢出
- 如果
假设数值位的进位为
C1
,符号位最高位进位为 Cs
将符号位进行异或运算:
V = C1 ⊕ CS
- 异或运算的原理是相同得到
0
,不同得到1
- 如果
V = 0
,表示无溢出 - 如果
V = 1
,表示有溢出
- 如果
存储在计算机内部的二进制数是正确的数据,也就是说不存在溢出的行为,所以采用一位符号位即可,比如
00001111
或者 10001111
。【补码加减法运算和溢出判断】双符号位就是在单符号位的基础上在添加一位符号位,两位符号位分别记为:
S1
、S2
。将符号位进行异或运算:
V = S1 ⊕ S2
- 异或运算的原理是相同得到
0
,不同得到1
- 如果
V = 0
,表示无溢出 - 如果
V = 1
,表示有溢出
- 如果
- 低位符号位参与移位,高位符号位代表真正的符号
- 使用双符号位的数一般是补码
推荐阅读
- 基于Java语言的递归运算例题详解
- 为什么补码可以将减法变成加法运算
- 两向量叉乘的计算公式_向量运算(叉乘几何意义)
- 运算符拓展
- javascript中instanceof运算符的用法详解
- 对原码,反码,补码的一点儿理解。
- PTA|一元多项式的乘法与加法运算
- Java赋值运算符
- OpenCV—python 形态学处理(腐蚀膨胀开闭运算边缘检测)
- Vue动态绑定背景图片及三元运算操作