补码到底是个什么东西

概述

先引入一个前提,在计算机中数字是以二进制进行存储的,也就是我们看到的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


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

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

原文地址:https://www.cnblogs.com/hujingnb/p/11779682.html

时间: 2024-10-09 08:25:13

补码到底是个什么东西的相关文章

Spark RDD到底是个什么东西

前言 用Spark有一段时间了,但是感觉还是停留在表面,对于Spark的RDD的理解还是停留在概念上,即只知道它是个弹性分布式数据集,其他的一概不知 有点略显惭愧.下面记录下我对RDD的新的理解. 官方介绍  弹性分布式数据集. RDD是只读的.分区记录的集合.RDD只能基于在稳定物理存储中的数据集和其他已有的RDD上执行确定性操作来创建. 问题 只要你敢问度娘RDD是什么,包你看到一大片一模一样的答案,都是说这样的概念性的东西,没有任何的价值. 我只想知道 RDD为什么是弹性 而不是 不弹性,

Spring到底是个什么东西?

虽然看了一阵子书,可以依然感觉Spring非常抽象. Spring的介绍: 引出: 依赖注入. 方式有: 构造器 注入.(+面向接口)实现松耦合. 创建应用组件(对象)之间协作的行为 称为装配. 即 注入 叫做装配. 常见的是通过XML 配置文件. AOP struts2的拦截器是用来过滤页面请求,页面请求到达action前会被过滤器拦截,而AOP实际是GOF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,主要是用来解决OOP和过程方法不能够很好解决的横切(crosscut)

嵌入式到底要学哪些东西?

有些人一直在问,嵌入式要学哪些东西?今天我详细告诉你到底要学哪些技术: 刚开始: 1)学习 Linux系统安装. 常用命令.应用程序安装. 2) 学习 Linux 下的 C 编程.这本书必学<UNIX 环境高级编程>.<UNIX 网络编程>,Rechard Stevens 写的,C 高手大都学习过 <C 和指针>.<C 缺陷与陷阱>.<高质量C/C++编程指南>.<C 专家编程>.<The C programming Langu

unity 第一步 了解unity到底是个什么东西

Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎.Unity类似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件其编辑器运行在Windows 和Mac OS X下,可发布游戏至Windows.Mac.Wii.iPhone.Windows pho

js到底可以实现哪些东西?

1. CSS+JS,可以实现很多很炫的效果,例如旋转,放大,变形等:这些的话,其实一般的前端开发在接触到 CSS3很nb的属性后,都能够游刃有余的实现 2. 前端的性能优化,这块其实涉及的东西很多,对于非js之内,就不过多的说了,主要说下与js方面有关的.我们知道js加载到页面中主要分为2步,一是下载,二是解析:如果js同步下载的话,其实会block住其他资源的下载,这个就是为什么把js异步掉的原因,那这又有一个问题,那我把js异步处理后,为什么不能把它放在头部呢?异步的资源不是不阻碍其他资源的

华为虚拟化到底是个什么东西?

之前写过中小企业网络怎样优化建设的文章,现在随着科技的发展云计算已经逐渐成熟,中小企业以后可以不用再建立自己的机房,直接在网络上去租用各种服务就行(Iaas.Paas.Saas).如下图: 三种服务模式对应关系,如下图: 三种服务商业模式关系,如下图: 在前段时间我在项目实施中帮助客户建立过整套的VMware虚拟化,其中包括服务器虚拟化.桌面虚拟化.备份容灾系统等,在此过程中确实感觉到VMware系统的强大功能和方便实用.其实除了VMware之外,还有Citrix.Microsoft.Linux

AJAX学习-到底是个什么东西

一.基础概念 1.全称:Asynchronous.JavaScript.And.XML(异步的 JavaScript 和 XML). 2.定义: Ajax不是一个技术,它实际上是几种技术,每种技术都有其独特这处,合在一起就成了一个功能强大的新技术. 3.包括: XHTML和CSS 使用文档对象模型(DocumentObjectModel)作动态显示和交互 使用XML和XSLT做数据交互和操作 使用XMLHttpRequest进行异步数据接收 使用JavaScript将它们绑定在一起 4.解释:是

HBase到底是个什么东西

经典解释: http://www.cnblogs.com/skyme/archive/2012/07/25/2608310.html HBase:非关系型数据库:分布式数据库:基于HDFS为最小存储单元,属于文件存储.列存储.(关系型数据库属于 行存储) NoSql:not only sql  非关系型数据 列存储: http://baike.baidu.com/link?url=MYn7JjlF_6vNUAIh30U6zKSq8FhkPCfKlT6tDTHI2L55aMKVTTn1ZCXdvQ

Socket到底是个什么东西

Socket在计算机专业术语上的翻译是"通信节点".计算机网络中阐述,计算机之间的通信通常指的是应用程序之间的通信.而应用程序之间使用Socket来通信,可以简单的认为,Socket封装了TCP/IP协议的具体实现,我们可以通过计算机高级语言在一个抽象层上来实现计算机的通信,而不用考虑具体的细节. 最常见的通信形式是客户端-服务端形式,我们打开浏览器上网,登录QQ聊天,就是属于这种形式.浏览器/QQ是客户端,而网站所在的Web服务器,QQ聊天服务器是服务端. 服务端通过 Socket