您的位置:首页 > 其它

关于补码的解释

2016-11-10 17:40 288 查看
今天讲补码的时候卡壳了,有点尴尬,太想当然了,向童鞋们道歉!在这里把补码的原理解释一遍。

先看8位的二进制的范围[00000000, 11111111],我们暂时只考虑真值,即这里面所有的数都表示数值,其对应的十进制数的范围为[0, 255],也就是说8位二进制数的模为256,如果把这个范围分为两部分[00000000, 01111111]和[10000000, 11111111],后面的这一部分是不是刚好可以表示负数的二进制补码呢?

我们看一个具体的例子,如果我们要表示-3,其二进制补码为:

(10000011)原 = (11111100)反 = (11111101)补

如果只把-3的补码的编码当数值看(没有符号位),则(11111101)2 = 253,那-3和253是什么关系呢?

-3 + 256 = 253,也就是-3 = 253(mod 256)(注:如果这个不能理解,就假设钟表圆盘上有256个刻度,依次标为0,1, …, 255,在任意一个时刻点,钟表顺时针拨253个刻度和逆时针拨3个刻度指向同一个刻度)

这下应该明白了。 从这个角度,也就可以解释5-3=5+(-3)=5+253 (mod 256) = 258 (mod 256) = 2(mod 256),用二进制补码运算时,将符号位能带入计算也是因为这个原因。

回到8位二进制范围[00000000, 11111111],如果用二进制补码表示带符号数,[00000000, 01111111]表示正数,[10000000, 11111111]表示负数,则(10000001)补 = -127, (10000010)补=-126, …, (11111111)补 = -1,那多出来的(10000000)补 = ? 显然,根据补码的定义,符号位为1,这应该是负数,从节约资源的角度,将其定义为-128最合适,这也就是为什么8位二进制补码的范围为[-128~127]的原因。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: