带符号整数,即整数,例如:-1、-2、1、2、3
带符号整数在计算机硬件内如何运算呢?
这就要提到原码补码反码了,正数其原反补码一样而负数则有不同,下面介绍负数的原反补码。
通常第一位为符号位,其余为数值位。第一位为0表示正数,第一位为0表示负数。若机器字长为n+1位,带符号整数的原码可表示的范围:-(2的n次方-1)~+(2的n次方-1)
以8符号位的通用寄存器表示:
A:+19表示为00010011 B:-19表示为10010011
A+B 如果单纯按位相加则为 10100110,而实际上+19+(-19)的答案是0,结果与实际相悖。这就要提出原码的缺点了,符号位不能参与运算,需要设计复杂的硬件电路才能处理,费钱!
该怎么解决呢?用补码表示真值——符号位可以直接相加。
负数原码变反码符号位不变数值位取反,反码变补码末尾加1
-19 原码 10010011 反码 11101100 补码 11101101
-100 原码 11100100 反码 10011011 补码 10011100
补码怎么转变原码呢?通常可以将补码最后一位减1转变为反码继而各数值位取反得到原码,还有一种简便方法。
正数其原码与补码形式相同,负数原码转补码与补码转原码可采用从右往左找到第一个1,这个1左边的所有“数值位”按位取反。
学会了原码转变补码后我们再回看A+B的运算
A +19 补码 00010011 B -19 补码 11101101
按位相加计算A+B的补码为00000000 (只保留8位)
值得注意计算机补码数值位不能解读为“位权”
计算机硬件做补码的加法:从最低位开始,按位相加(符号位参与运算),并往更高位进位。
聊完了补码的加法下面看看补码的减法:
A-B等价为A+(-B)那么如何通过B的补码求-B的补码呢?只需将全部位按位取反、末尾+1,注意全部位是指符号位加数值位。
例如 +19 补码 00010011 全部位按位取反 11101100 末尾+1 11101101
-19 补码 11101101 全部位按位取反 00010010 末尾+1 00010011
有没有更快速的方法呢? 有 与上述原码变补码方式类似,只需从右往左找到第一个1然后将其余位包含符号位全部按位取反。