前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >补码到底是个什么东西

补码到底是个什么东西

作者头像
烟草的香味
发布2019-11-10 16:19:39
6590
发布2019-11-10 16:19:39
举报
文章被收录于专栏:烟草的香味烟草的香味

概述

先引入一个前提,在计算机中数字是以二进制进行存储的,也就是我们看到的2,在计算机中存储的是10。我们进行的加法运算 2+1=3 在计算机中是这样的(这里先假设计算机存储的是4位二进制数字) 0010+0001=0011

很容易看的出来,4为二进制数能表示的最大数字是1111,就像两位十进制数表示的最大数字是99一样。那如果在进行加法运算时,结果超出存储的容量怎么办?比如:9+9=18 二进制表示为:1001+1001=10010,但是,因为只能存储4位数的原因,最高位丢了,结果变成了 0010,也就是2,这时是发生了溢出的。在做运算时要避免数值发生溢出(当然,现在计算机存储的数字为64位,日常使用完全不用担心)

运算不光有加法,还有减乘除。乘法就是多次加法,除法就是多次减法。那么减法如何实现呢?在刚开始的时候,计算机只能进行加法运算,这时一部分人想办法让其能够直接进行减法计算,而另一部分人想通过加法来实现减法,最终后者先给出了解决方案。(只是我臆想的情景)

通过加法来实现减法

还记得上面提到的,四位二进制数表示的最大数字为15,当发生溢出时:

16=>二进制:10000 => 0 17=>二进制:10001 => 1 显然,去掉最高位等于减去16

那么能不能利用加法溢出来实现减法呢?下面简单推倒一下:

9-2=7 若要实现 9+x=7 那么利用溢出的原理,就要实现 9+x=7+16=23 简单的解一下方程 x=23-9=14 , 很好,来验证一下:

9+14 的二进制表示为:1001+1110=10111 最高位溢出,结果为:0111 也就是7,完美。

下面问题来了:如何将上边的2转成14呢?也就是讲二进制的0010转成1110。他们有什么关系呢?

伟大的数学科学家前辈们总结出了规律。并发明了反码和补码的概念。补码就是上面转换后的14。

原码=>按位取反=>反码 反码=>加1=>补码

虽然不知道这个规律是如何找出来的,但经过无数次验证,确实是这样。

引入负数

当引入了负数的概念时,为了表示正负,规定第一位为符号位(0为正,1为负),因为引入符号位,原来的4位数,能表示的最大值也变成了0111

因为负数的引入,现在所有的减法都可以当做加法来实现了,9-2=9+(-2),或者说9+(-2)=9-2。计算仍然是通过补码来实现。

负数的补码为:符号位不变按位取反,再加1 正数的补码为:它本身

负数的补码很好理解,就是上面总结的规律,利用加法来实现减法。正数的补码为啥是它本身呢?你看刚才分析的减法,只有被减数进行了转换,减数没变吧。很好理解。其实也是为了可以统一进行处理,引入补码后,正负数可以使用一套加减法规则进行计算。

简单实验一下:

2+(-4)=-2 -4 => 二进制表示:1100 => 补码:1100 2 => 二进制表示:0010 => 补码:0010 1100+0010=1110(补码) 将计算结果再转成原码 1010,-2没毛病

然后,有一个尴尬的问题,正数的0为: 0000,负数的0为:1000,同一个数字,但是换成补码后,你会发现是同一个数字: 0000

总结一下:利用补码计算,就是通过加法来实现减法运算,是利用了计算机存储位数有限,超出发生溢出并丢失最高位的特性。

不知道补码是哪位伟大的科学家发明的,前人栽树后人乘凉,膜拜。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 烟草的香味 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 通过加法来实现减法
  • 引入负数
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档