layout: post title: D码点评:17 补码之美 description: ~ 麻辣评点,善意满盈 author: zoomq categories: gDgcoDe tags: gdg D码点评 dd wechat coding
来自: 2014-01-16 玉伯 WTP
在计算机中,为什么 -1 要用补码表示为 1111 ?
首先要了解 CPU 的基本单元 ALU 模块. 在 ALU 里,加法是最基本的运算. 通过程序,乘法可以转换为加分,除法可以转换为减法. 补码表示,则可以让减法直接转换为加法. 这样,ALU 核心只需要加法器就好,加法器可以通过集成电路中的晶体管来实现.
要将减法转换为加法,在数学公式里,只要加一个括号即可:
X - Y = X + (-Y)
在 CPU 里,如果想让加法器具备减法功能,核心是负数如何表示.
原码
大自然赐予了我们硅,硅是很稳定的半导体,通过 PN 结等精细工艺,可以做成各种晶体管. 在晶体管的世界里,基本状态只有 on 和 off 两种,也就是只有
1 和 0. 于是,在计算机里,我们采用二进制来表示整数.
这样,最自然的想法是,对于正整数来说,直接从十进制转换成二进制就好. 比如 1 用 0001 来表示,2 用 0010 来表示.
负整数怎么来表示呢?增加一个符号位来表示?比如二进制的最高位为 0 时表示正数,为 1 时则表示负数.
这样,-1 用 1001 表示,-2 用 1010 表示. 这就是原码的概念.
在原码的表示里:
1 - 1 = 1 + (-1) = 0001 + 1001 = 1010 = -2
显然,原码表示法,不能把减法变成加法,悲催.
补码
据说,所有科学问题,最后都是数学问题,而所有数学问题,最后都离不开哲学.
哲学太深奥了,我们来看看从数学上,如何把 X + (-Y) 转换成二进制相加.
我们希望有某种表示方法,使得 1 + (-1) = 0000 现在 1 用 0001 来表示,-1 应该怎么表示?
-1 = 0000 - 0001 = 10000 - 0001 (高位借一) = (1111 + 0001) - 0001 = (1111 - 0001) + 0001(第一步:取反) = 1110 + 0001(第二步:加一) = 1111
也就是说,如果 -1 用 1111 来表示,则
1 + (-1)
的二进制表示通过加法就能进行减法操作,达成了我们最初的目的.
进一步,针对所有负整数:
-Y = 0000 - Y = (1111 + 1 ) - Y = (1111 - Y) + 1 将正整数 Y 的二进制先取反,再加一
整数转换成二进制后,先取反,再加一,这就是负整数的补码表示. 正整数的补码跟原码一样.
到此为止,补码的前世今生就说完了,但还有些有意思的事情.
简单之美
可以说,补码的出现,是为了能让 ALU 在设计时更简单:只需要加法电路就好,不需要减法电路. 追求简单,极致的简单,这能给性能,工业化等带来很大价值.
再从数学上来看,整数遵循一些很容易被我们忽略的重要规律:
1. 数轴上,左边的数永远小于右边的数. 比如 -8 < -2 < 0 < 3 < 5 2. 数轴上,只有一个零. 3. 相邻整数之间相差一.
来看补码表示:
1000 -8 1001 -7 1010 -6 1011 -5 1100 -4 1101 -3 1110 -2 1111 -1 0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8
-
只看负数的补码表示,明显 1000 < 1001,补码表示下,左边的负数很自然小于右边的负数.
-
很明显只有一个零,就是 0000,不存在 -0 跟 0 的表示不一样.
-
再看相邻整数之间,左边的整数加一,就是右边的整数,包括 1111 + 1 = 0000 .
初看补码,有些怪异,不直观,但在二进制的世界里,补码是如此自然. 第一个想出用补码来表示整数的人,真是个天才啊.
(完)
题图:世界有 10 种人:一种懂二进制,一种不懂.
是也乎
补码,其实就是最经典的工程思维指导数学解决实际问题的案例, 事实上,在计算机发展历史上, 有很长的时间人们试图使用自然的10进制计算机的, 甚至于在前苏联竟然折腾出了据说是工作效能不低的三进制计算机!!!
但是,人类这种生物天生是好逸恶劳的, 所以,总是简洁的方案,体系,理论,工程,最后胜出... 所以,慢慢的,计算机世界,二进制成为了主流...
当然,任何长期博弈出来的事儿,都是细思恐极的事儿! 补码这事儿,追到根儿上是个硬件的物理特性的事儿, 其实,互联网发展到现在,大家死磕的,的确依然是那几种物理特性, 但是,下一代计算硬件体系出来后,可能整个儿编程思想就得升级了, 怎么升/乍兼容... 是未来工程师和程序员共同折腾的是也乎!
以上...
码不停提马上无虫 ;-)
|_|0|_| |_|_|0| |0|0|0|
加入 珠海GDG
- 注册 G+
- 关注 GDG Zhuhai
- 成为 GDG Zhuha开发者
通过 珠海GDG 可以:
第一时间获知谷歌最新的技术, 可以学到如何去谷歌平台上赚钱的思路和方法, 可以认识很多有可能将来一起走上自己创业道路的人, 可以学会把你的创新带向国际市场, 参加那里的活动有经常和国际上的开发者们进行交流的机会...
PS:
若无意外,题图都是从原文提取或是通过 Google 图片搜索出来的, 版权属左, 不负责任 ;-)
PPS:
珠海GDG wechat/Blog 都是欢迎投稿的,只要追认内容吻合以下条件:
0. 有趣 ~ 至少是自个儿有兴趣的领域吧... 1. 有料 ~ 至少有点儿原创的东西吧.. 2. 有种 ~ 至少不能是成功学吧!
有好物的,及时向大妈们吼: [email protected]
微信栏目
当前应该是:
G术图书 (gb:推荐好书,书无中外) D码点评 (dd:麻辣评点,善意满盈) G说公论 (gt:时评杂文,新旧不拘) 珠的自白(dm:大妈自述,每周一篇) 海选文章(hd:得要相信,大妈法眼)
总之! 珠海的组委大妈们,决定开始坚持发文,方方面面细细同大家分享/交流
总之! 请大家告诉大家, 珠海生活中的技术社区
已经认真回归 微信,都来订阅吧!
订阅方法
- 搜索微信号
GDG-ZhuHai
- 或查找公众号:
GDG珠海
- 或扫描:
GDG珠海 社区资源:
- 邮件列表: [email protected] (可发空邮件到 [email protected] 即完成订阅)
- 微博: @GDG珠海
- 微信: GDG珠海
- G+ 主页: GDG ZhuHai
- G+ 社群: ZhuHai GDG
Author: /mail / gittip / github