15加减运算和溢出判断[中章]
加减运算和移除判断
我们使用加法器直接使用原码进行运算对于硬件逻辑的要求太高了,所以我们一般不使用原码进行运算,计算机中通常采用补码进行算术运算
使用补码进行运算
使用补码进行运算,符号位一样参与运算
设机器字长为8位(含1位符号位),A=15, B=-24,求[A+B]补和[A-B]补
$$
\begin{align*}
& A=+1111 \rightarrow \overbrace{0,0001111}^\text{原码}\rightarrow \overbrace{0,0001111}^\text{补码}\
& B=-11000 \rightarrow 1,0011000 \rightarrow 11101000\
\end{align*}
$$
计算公式
$$
\begin{align*}
&[A+B]_补\
&= [A]_补+[B]_补 \
&=0,0001111+1,1101000\
&=1,1110111\
\end{align*}
$$
把最终结果转换成原码,然后转换成真值
$$
10001001^\text{原码} = -9^\text{真值}
$$
对于补码快速转原码的一个方式
由之前所学的知识可知,负数补码移位的时候
- 最左边到最右边的1和反码一样
- 最右边的1到最后边和原码一样
所以我们可以有一个更快的方法来把负数补码转换成原码
- 我们来数最右边的1,然后最右边的1到最右边原封不动
- 然后最右边的1到最左边全部取反
比如
$$1,111011\underline{1} = 1,00010\underline{1}$$
$$
1,110\underline{1}000[补码] = 0,001\underline{1}000[原码]
$$
溢出
可以看到,我们的A+C本来应该等于139,但是现在却等于-117,这就是数值发生了溢出
溢出判断
只有“正数+正数”才会上溢–正+正=负
只有“负数+负数”才会下溢–负+负=正
因为正数-负数的绝对值一定小于这两个数
计算机的溢出分为两种,
- 一种为上溢
- 一种为下溢
最常用的判断溢出方法(双符号位)
如果两个符号位相同表示没有溢出,如果不同则表示溢出
符号扩展(int->long)
防止溢出的方法就是把短数据变成长数据
总结
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!