原码、反码、补码
在计算机内部都是用二进制补码进行运算的,忽然脑子一抽,十进制能不能进行补码运算呢?
首先随便列出一个十进制的式子:
89-12=77
二进制的负数是通过取反再加一来获得补码的
二进制正数的原码=反码=补码
显然,89
的补码为89
那么-12
的补码是多少呢?
- 开始,我是想用
10
减去每一个数,毕竟它叫十进制数 - 用
10
去减每一个数,类比到二进制就是用2
减去每一个数 - 但是,这显然是行不通的,因为
1111
的反码是0000
,0101
的反码是1010
- 那就只能用
9
喽
9
减去12
的每一位数得到:87
将上面随便写出的式子添加上符号位
并写成补码
的形式,将会得到:
0 89 + 9 (87 + 1) = (10) 77
结论: 十进制取反操作->9-x 所以,二进制的取反操作为:1-x .
不论是多少进制都有原码,反码,补码的概念,都能用补码进行运算 .
tips: 如果有人问-9的补码是多少,你得回答: (1 0111)2 .
两个负数相加
-78 - 66 = -144
-078 - 066 = -144 // 位数不足,加一个最高位
9 (921 + 1) + 9 (933 + 1) = (19) 856 // 添上符号位,按位取反,写成补码形式
(19) 856 = (19) (143 + 1) // 将补码转换成原码,大功告成
为什么二进制的补码是反码加一,为什么十进制的补码也是反码加一?
这 有 什 么 意 义 呢 , 有 什 么 意 义 呢 ? \color{#FF7D00}{这有什么意义呢,有什么意义呢?} 这有什么意义呢,有什么意义呢?
还记得当初你是怎么学会减法的吗? 现在告诉你, 你白学啦, 我们根本不需要学什么减法 . (当然, 这只是开玩笑)
或许对日常使用十进制,靠算数逻辑运算符+
和-
来区分正负数的人类来说, 意义并不大 .
但对一个只懂0
和1
, 靠最高位是0
是1
来区分正负数, 加法做的很快,减法不行的家伙来说, 意义非凡
所以, 你是做加法快呢? 还是做减法快呢?