我们知道计算机的符号数有三种表示方法:原码,反码和补码。它们分为符号位和数值位,通常符号位为最高位,且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。 笔者对补码也是刚开始思考,也许会有错误,欢迎各路大神勘误,不胜感激