在看本篇文章前,请先抛弃类比于时钟的想法,个人觉得那种理解方法真的没有必要,还容易把自己搞糊涂。
下面来了
在现实世界中,数字都是以源码表示的,例如正4的自然二进制和负4的自然二进制仅仅相差的是最高位的符号位。由于计算机世界中没有减法,所以所有的数字需要以补码的形式表现出来,包括正数和负数,然后进行补码的相加就可以了,运算结果依旧是补码,需要变回源码,在真实世界中才能一眼看出它所表示的数字。
正数的源码(即最高位符号位为0)的反码和补码是它本身。
负数的源码(即最高位符号位为1,其余位和正数没有区别)的反码和补码要保证符号位不变,数值位取反再加1。
负128(源码)的反码是八个1,补码与源码相同,因为反码的数值位也及7个1在加1时已经溢出了,但是又不能影响符号位,所以符号位依旧是1,而数值位已经溢出为0了。(0000 0000是0,,,,,,,,,1000 0000是-128)(1111 1111是-127)
计算机中补码的计算,和自然二进制计算没啥取别,符号位也参加运算,计算结果按正数或者负数返回其源码就可以了,当然,正数的源码还是其本身。