负数补码为什么取反加1?负数的补码?
负数补码为什么取反加1?
【资料图】
大家都知道负数的补码是其绝对值的原码取反加一,以八位有符号数为例:
但是为什么是这样呢?
补码之所以存在,是因为计算机不能(或者不方便,待研究)像我们人类那样去做减法,所以通过特定的方式让计算机通过做加法的方式实现减法的效果。这种方式的原理,拿钟表来说明一般会比较容易理解。
比如现在是下午5点,然后我们想知道之前2个小时几点,但钟表又不能倒退,怎么办呢?我们知道,对钟表而言,12个小时是一个循环,12个小时前也是5点,但是是上午五点。
那么2小时前的时间可以这么算:
其实补码的原理类似,还以8位有符号数字为例,想象一个钟表有0~127共128个刻度,它的循环为128:
从以上可以看出,减去x时可以这样算,先回拨一圈(-128),然后再往后走回拨多了的(128 - x)步。
在补码中可以将最高位符号位理解为回拨一圈的标记,比如
然后再看下如何从x迅速求出(128 - x),以2和126为例,当两个数和为127时,是相互取反的关系。
可知,当两个数和为128,是相互取反加1的关系。
最终可知,对2取反加1,分为两个部分:
1)低7位:表示求出回拨多了的部分,也就是(128 - 2) = 126
2)最高位符号位:对符号位取反,符号位变为1,代表着对某个数"回拨一圈",即-128;
负数的补码?
负数的补码是该数的反码加1。负数的反码是对原码按位取反,只是最高位(符号位)不变。表示相对原码复杂、运算相对简单,符号位参加运算,只需要设置加法器,但符号位的进位位需要加到最低位、0的表示不唯一。
计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。