上一小节我们讲了无符号整数的表示和运算,这次我们讲一下带符号整数的表示和运算
带符号整数的表示和运算_原反补
1.带符号整数的表示
其实很简单,我们在第一位用0/1来区分是正数还是负数,比如8bit的寄存器,第一位是符号位,0正1负,后面7位是数值位,所以对于8bit的寄存器来说,能存最小的数应该是11111111=-127,能存最大的数应该是01111111=127
几个注意的点:
1.如果告诉你机器的字长,x=-19,你应该书写[x]原=1,0010011;如果没有指明机器的字长,也可以书写为[x]原=1,10011
2.真值0有两种形式:+0和-0,[+0]原=0,0000000 ; [-0]原=1,0000000
2.带符号整数的加法
上一个小结我们讲过无符号整数的加法运算,同学们来回顾一下,无符号整数的加法是怎么做的?忘记的同学可以看我上一篇文章。那带符号整数的加法运算可以和无符号一样吗,我们来试一下
很明显正确结果应该是0,但是得到的却是1,0100110,很明显是错误的,那我们对于有符号的应该怎么运算呢?直接告诉答案,将两个数从原码转变成补码,补码按位相加,之后再转变成原码就是最终答案
我们给个例子:
这里有个问题:-19的补码为什么是11101101? 各位同学还记得原码是怎么转补码的吗?上个文章我们讲过无符号的转变,先是将原码全部取反后+1就是反码;那有符号也是这样的吗?
对于正数来说,原码、反码、补码都是相同的
对于负数来说,原码转反码,符号位不变,数值位取反得到反码,再末位+1得到补码
有一个注意的点,原码到反码和反码到原码的操作过程是一样的,反码到补码是末位1,那补码到反码按道理来说是末位-1,可以是可以,不过做减法不太好方便运算,下面介绍一下另一种方法
1.首先将补码转原码,从右到左找到第一个1,然后将前面的数值位全部取反(注意是数值位,不要把符号位也取反了!!!)
2.得到原码之后将数值位全部取反
这是咸鱼老师教我的,但是我感觉如果单单是想补码转反码的话,有点多此一举,因为有些数值位连续取反了两次,也就是没变,所以我自己归纳创新了一下:
1.补码转原码(原码转补码):从右到左找到第一个1,然后将前面的数值位全部取反
2.补码转反码:从右到左找到第一个1,然后将1后面的数值位全部取反(包括找到的第一个1)
OK介绍到这里我们才只是说了原码转补码,还记得我们为什么要原码转补码吗?
目的就是为了转补码后两个补码相加,再转原码得到答案,所以现在大家再看这张图应该能理解了吧
注意:下图两个补码相加得到的是100000000,但是它是8bit寄存器,只能存8位,所以最前面的1就丢弃掉
再给一个例子练练手,大家可以动手算一下,A=-19 B=-19,A+B得到的补码是什么?A+B的答案是什么?
3.带符号整数的减法
之前我们讲过,减法运算造价比加法更高,所以我们需要把减法转变成加法,无符号减法我们讲过,我们首先把减数全部位取反后末位+1,得到补码,然后按位相加就好了。其实有符号整数补码的减法运算也是一样的。
将减数补码的全部位取反后末位+1,然后按位相加得到答案的补码,然后补码转原码就是答案
4.小结
通过这一小节,我们需要熟练掌握有符号数原反补之间的转化,所有带符号数加减法之前都需要变成补码这个中转轴,所以我们要熟练掌握补码之间的加减法运算