说说补码

  所有的数学原理,背后都是最简单最自然的思维和道理而已!首先我们知道一个数在计算机里是用其补码形式表示、参与计算的,这个补码就是所谓机器数。补码被设计出来就为了 CPU 可以把减法当加法算。而把减法当成加法算,原理和我们算法里学的“减一个数等于加上这个数的负数”是类似的,计算机里把减法当成加法算的原理近似来说是“减一个数等于加上这个数的补,然后取余”。
  具体实现的时候,巧妙的使用了符号位,对于大数减小数,可以理解为加上减数的补,小数的补比较大,并溢出,余下的就是结果。对于小数减大数,大数补比较小,相加之后并未溢出,符号位为 1 成为负数,1 ~ 7 位 是结果的补(以 m 为 10 举例,2 - 3 = 2 + 7 = 9),加上符号位,正是结果的补码形式。在运算的时候,取反并加一是求补,取余是通过符号位参与运算必要时产生溢出实现的。
  以 byte 为例,第一位是符号位,m 是 2^7 = 128,[0, 127]。如果我们计算 a - b,b 的补就是 2^7 - b。再来看看补码,如果我们把 b 的补码认为是 d,d 是 b 的取反并加一,这个时候如果我们把 d 和 b 的 1 ~ 7 位都看成无符号的正数,b + d = 2^7(1 ~ 7 位因为互为反,加了之后全为 1,最后再加一,全部进位,得到 2^7),所以看 1 ~ 7 位, d = 2^7 - b。符号位标识正反,让符号位参与运算,为了方便的使用溢出来实现取余。-128 的补码是 10000000,是个特殊存在,是个没有原码的合法补码(原码理论是 100000000,不是不存在,只是没法用 byte 表示,刚好补码用 byte 表示的了,所以这个数就成了没有原码表示,只有补码表示的特殊的数了)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章