北京 切换校区

全国24小时免费热线

400-009-1906

张大胖的加法器

时间:2019-01-09   来源:尚学堂   阅读:41
首页> 张大胖的加法器

  加法器

  热爱编程的张大胖在大学时最烦的一门课之一就是《数字电路》,他一直觉得和编程没什么关系。

  有一次课程设计是实现一个加法器,大胖使用逻辑电路,费了九牛二虎之力才实现了4位的加法。

  这4个二进制位能表达的数有16个,从0到15:

  大胖用他的加法器计算了一下8+3:

  8+3=1000+0011=1011=11

  还不错,再计算一下9+7:

  9+8=1001+1000=0001

  怎么变成了1?奥,我这儿只有4位,能支持的最大数字就是15,而9+8的结果是10001(十进制16),计算结果溢出,最高位的1被丢弃了!

  其实这也符合要求,大胖顺利的交了作业。

 

  用加法来表示减法

  可是下一次课还是课程设计,老师竟然要求在这个加法器上实现减法,这可把大胖给难住了,在加法器上实现减法,真是个变态的需求。

  遇到了问题,张大胖自然会“跪求”好基友,电脑高手Bill。

  Bill说:“这个要求一点都不变态,用加法器同时实现加法和减法,能极大的节省CPU的电路设计。”

  “你就说该怎么实现吧”

  Bill说:“我先给你说一下原理,在你定义的4位二进制中,一共可以表达16个数,我们引入一个‘补数'的概念,例如3的补数是13,4的补数是12,5的补数是11,当你计算7减去3的时候,可以变成7加上3的补数,即7+13”

  “可是7+13是20,但是7-3等于4啊”

  “20其实已经超出你4位二进制能表达的16个数了,已经溢出了,对吧,所以20还得减去16,就是4了。你用二进制算一下。”

  7-3=0111-0011=0111+1101(二进制13)=10100

  10101已经溢出了,去掉最高位是0100,就是十进制4了。

  “果然不错”张大胖说“这让我想到了钟表,现在是7点,我想让它回到4点,有两种办法,一种方法是让时针后退3格,另外一种方法是让时针前进9格,前进到12点的时候,其实就相当于溢出了,舍弃掉。"

  Bill说,"看来你已经Get了,数学上有个词叫做求模,说的就是这个运算,还以时钟为例"

  向后退3格:7-3=4

  向前进9格:(7+9)mod12=4

  向前进21格:(7+9+12)mod12=4

  向前进33格:(7+9+12+12)mod12=4

  .....

  “这是一种以进为退的策略”Bill接着说"用这种办法就把减法变成了加法"

  “但是我怎么得到所谓的补数呢?从3怎么得到13呢”

  “这很简单,对于二进制,前辈们想出了一个异常简单,又特别适合计算机的算法,对二进制数的所有位取反,然后加1”

  “神奇啊,前辈们竟能想出这么巧妙的办法!”

  “这就是所谓的补码了”Bill总结道

 

  负数的表示

  Bill问道:“刚才咱们说的都是整数的加减法,负数你考虑了没有啊?大胖?”

  “我也刚刚想到,现在我知道7-3可以换算成7+13了,如果是3-7呢?”

  “负数一引入,系统就变得更复杂了,首先你得用一个标志位来表示整数还是负数吧:”

(表格1)

  张大胖说:“明白了,最高位的0表示正数,1表示负数,真正有效的数字只剩下3位了,正数的范围是从1到7,负数的范围从-1到-7,不过这里出现了两个零!一个正0,一个负0,这不妥吧。”

  “先别急,之前说到减法可以变成加法,秘密就是用补码,例如8-3相当于8+(-3)的补码,那我们完全可以把表格1中的负数用补码表示,然后把那个负0特别当做-8来处理:”

  Bill接着说:“按照上面的表格,现在我们来计算一下7-4,7是0111,-4是1100,注意我们把符号位也算进去了,两者相加:

  “让我试试4-7,”张大胖说,4是0100,-7是1001,两者相加:

  “妙啊”张大胖不禁赞叹起来,“把负数用补码表示,不但减法变加法,连符号位都可以参与运算了!”

  “是啊,我们通过补码能极大的简化电路的设计,你一定要记住,在计算机内部,是使用补码来表示二进制数,如果是一个正数,补码就是它本身,如果是个负数,需要把除了符号位之外的二进制数进行取反加一的操作"

  "此外,我想你也能总结出来,你这个4位的系统如果只表示无符号数(没有负数的话),它的范围是[0,2^4],即[0,16];

  如果要想表达有符号数(负数和整数),它的范围就是[-2^3,2^3-1],即[-8,7]。在高级编程语言像C,Java,你经常会看数据类型的取值范围,你应该明白其中的原理了。”

  (完)

相关资讯

  • 北京校区
  • 山西校区
  • 郑州校区
  • 武汉校区
  • 四川校区
  • 深圳校区
  • 上海校区
  • 广州校区
  • 保定招生办

北京海淀区校区(总部):北京市海淀区西三旗街道建材城西路中腾建华商务大厦东侧二层尚学堂
北京京南校区:北京亦庄经济开发区科创十四街6号院1号楼 赛蒂国际工业园
咨询电话:400-009-1906 / 010-56233821
面授课程: JavaEE培训大数据就业班培训大数据云计算周末班培训零基础大数据连读班培训大数据云计算高手班培训人工智能周末班培训人工智能+Python全栈培训H5+PHP全栈工程师培训

山西学区地址:山西省晋中市榆次区大学城大学生活广场万科商业A1座702
咨询电话:0354-3052381 / 18903441162

郑州学区地址:金水区东风路经三路北100米注协大厦10楼
咨询电话:0371-55177956 

武汉学区地址:湖北省武汉市江夏区江夏大道26号 宏信悦谷创业园4楼
咨询电话:027-87989193

四川学区地址:成都市高新区锦晖西一街99号布鲁明顿大厦2栋1003室
咨询电话:028-65176856 / 13880900114

深圳校区地址:深圳市宝安区航城街道航城大道航城创新创业园A4栋210(固戍地铁站C出口)
咨询电话:0755-23061965 / 18898413781

上海尚学堂松江校区地址:上海市松江区荣乐东路2369弄45号绿地伯顿大厦2层
咨询电话:021-67690939

广州校区地址:广州市天河区元岗横路31号慧通产业广场B区B1栋6楼尚学堂(地铁3号线或6号线到“天河客运站”D出口,右拐直走约800米)
咨询电话:020-2989 6995

保定招生办公室

地址:河北省保定市竞秀区朝阳南大街777号鸿悦国际1101室

电话:15132423123

Copyright 2006-2019 北京尚学堂科技有限公司  京ICP备13018289号-19  京公网安备11010802015183  
媒体联系:18610174079 闫老师  

有位老师想和您聊一聊