计算机凭啥用二进制
不管是不是程序员,大家可能都知道二进制是个什么东西。
包括计算机在内,几乎所有电子设备都采用的二进制。
可是,为什么会这样呢?
在说这个问题之前,先解决另一个问题——为什么大多数国家的人类都采用十进制?
因为,人类有十根手指。
然后,没了。
当然,在人类文明发展的长河中,也诞生过一些其他的进制。
比如苏美尔人使用十二进制,据说是通过大拇指点其他四根手指的指节得出的。
还有玛雅人的二十进制,大概率就是还算上了脚趾。
古巴比伦用六十进制,难道是五根手指搭配十二个指节?
根据人类选择计数方法的进制,不难发现,人类总是根据身边最直接的物品来确定进制。
如果人类只有七根手指,那估计我们就该用七进制了。
对人类如此,对机器也是如此。
人类有手,机器有开关。
开关只有“接通”和“断开”两种状态,正好跟“1”“0”对应。
于是,机器用二进制便成了天经地义的事情。
仅仅是表示一个数据的话,二进制似乎只要增加位数就能做到。
但要命的来了。数字不光有正数和0的存在,还有负数。
于是,人们就把最高位拿出来表示符号。
正数用“0”,负数用“1”。
用这种方式表示的数字叫做机器数。也叫做原码。
比如
+3原码是0000 0011
-5原码是1000 0101
8bit原码数值范围为[1111 1111,0111 1111]即[-127,127],共255个数字。
看起来似乎很方便,然而,当进行不同符号的加法或同符号减法运算的时候,麻烦来了。
原码的运算不能直接判断结果的正负,需要比较两个数值的绝对值,由绝对值大的值来决定符号。
比如
“+3”+“-5”
1000 0101绝对值0000 0101
0000 0011绝对值0000 0011
符号相反的加法即是绝对值的减法
所以结果的绝对值为0000 0010(2)
再看符号,1000 0101绝对值大于0000 0011
所以结果应该为1000 0010(-2)
所以“+3”+“-5”=“-2”
很复杂对不对?
不光人觉得麻烦,机器也觉得麻烦。
于是,便有了反码。
那么,反码是什么呢?
正数的反码跟原码一致。
负数的反码是将原码除符号位以外所有位取反。
比如
+3反码是0000 0011
-5反码是1111 1010
8bit反码数值范围为[1000 0000,0111 1111]即[-127,127] ,共255个数字。
那,反码有什么好处呢?
同样,“+3”+“-5”
0000 0011 + 1111 1010 = 1111 1101(-2反码)
是不是简单多了?
但,还是有一个问题。这个问题是从原码遗留下来的。
无论原码还是反码,0有正负两种0
0000 0000(原码 +0)
1000 0000(原码 -0)
0000 0000(反码 +0)
1111 1111(反码 -0)
这个问题又该怎么解决呢?
于是,便终于有了补码。
补码是这么表示的:
正数的补码依然是原码
负数的补码是将原码除符号位外各位取反,之后+1。
也就是将反码+1。
比如
+3补码是0000 0011
-5补码是1111 1011
虽然有点难理解,但是采用补码之后,不光解决了计算问题,还把正负零的问题规避了。
除了这两点,补码还能比原码和反码多表示一个数字。
8bit补码数值范围为[1000 0000,0111 1111]即[-128,127] ,共256个数字。
当“+3” + “-5”时
0000 0011 + 1111 1011 = 1111 1110(-2补码)
0只剩下了0000 0000这一种表示方法。
反码的1111 1111现在是补码中-1。
反码的1000 0000(-127)也就成了补码可以多表示的-128。
因此,在计算机系统中,数值一律用补码来表示和存储。
如今,计算机固然已经十分强大,但别忘记,是人类的智慧赋予的这一切。