首页
登录 | 注册

补码的加减乘除和移位

我们知道计算机的符号数有三种表示方法:原码,反码和补码。它们分为符号位和数值位,通常符号位为最高位,且0表示正,1表示负。注意符号位在移位时是不变的,在取补码时是变的。且正数补码等于原码


以-3为例求补码:

3的原码是0b0011

反码是0b1100(所有位取反)

补码是0b1101(反码+1)


补码加法:

[X+Y]补 = [X]补 + [Y]补

例如X= +0011 0011 = 51, Y = -0010 1001 = -41

[X]补 = 0011 0011, [Y]补 = 1101 0111

[X+Y]补 = [X]补 + [Y]补 = 0011 0011+1101 0111 = 0000 1010= 10


补码减法:

[X-Y]补 = [X]补 - [Y]补 = [X]补 + [-Y]补

例如1 - 1 = 1 + (-1),与补码加法类似,相信大家能理解。


补码乘法:

机器只能进行正数运算,因此当x为负数时,就将它变为正(负数的补码),即[X*Y]补== 【[X]补】补 × [Y]补,所得结果再取补码

例如原码x = -0011 = -3, y= +0011 = +3

[X]补 = 1101,【[X]补】补= 0011

[x*y]补 = [0011 * 0011] 补= [01001]补 = 10111 = -01001 = -9


补码除法:

[X/Y]补 = [X]补 / [Y]补

例如原码x = -0011 = -3, y= +0011 = +3,同样负数要变为正

[X]补 = 1101,【[X]补】补= 0011, [Y]补 = 0011

[X/Y]补 = [0011 / 0011]补 = 1111 = -1


补码移位:

符号位在移位时是不变的,正数左右移位都补0,负数向右移位空出来的位补1,左移空出来的位补0。

例如x = -0001 = 1111,

右移1位(相当于除以2)是1111 = -0001 = -1,因为1除以2余1

左移1位(相当于乘以2)是1110 = -0010 = -2


为什么负数向右移位空出来的位补1,左移空出来的位补0呢?

笔者的理解如下:先把负数取补码(变为正数),正数右移一位相当于除以2,此时补0,最高位便是0,再取补码,最高位变为1,因此负数补码右移要补1。而正数左移一位相当于乘以2,此时补0,最低位便是0,再取补码(取反并加1),最低位变为0,因此负数补码左移要补0。


笔者对补码也是刚开始思考,也许会有错误,欢迎各路大神勘误,不胜感激



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.009 s.
京ICP备10005923号