补码到底是个什么东西(代码片段)

烟草的香味 烟草的香味     2022-12-23     727

关键词:

 

概述

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


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

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

系统可用性:sre口中的3个9,4个9...到底是个什么东西?(代码片段)

...到的一句话是你的接口有几个9?2个9?3个9?到底几个9才算是稳定呢?今天我们就从系统可用性(Availability)开始,为你讲解开发过程中那些常用的指标名称。1.系统可用性1.1-什么是系统可用性概念... 查看详情

系统可用性:sre口中的3个9,4个9...到底是个什么东西?(代码片段)

...到的一句话是你的接口有几个9?2个9?3个9?到底几个9才算是稳定呢?今天我们就从系统可用性(Availability)开始,为你讲解开发过程中那些常用的指标名称。1.系统可用性1.1-什么是系统可用性概念... 查看详情

系统可用性:sre口中的3个9,4个9...到底是个什么东西?(代码片段)

...到的一句话是你的接口有几个9?2个9?3个9?到底几个9才算是稳定呢?今天我们就从系统可用性(Availability)开始,为你讲解开发过程中那些常用的指标名称。1.系统可用性1.1-什么是系统可用性概念... 查看详情

大数据面试:面试官要求我了解过presto——presto到底是个什么东西(代码片段)

前言大家好,我是程序员manor,我希望自己能成为国家复兴道路的铺路人,大数据领域的耕耘者,平凡但不甘于平庸的人。事情是这样的我在实习僧App上发现一家公司非常匹配我的需求~城市匹配技能匹配福利匹配还是一家游戏公司ÿ... 查看详情

大数据面试:面试官要求我了解过presto——presto到底是个什么东西(代码片段)

前言大家好,我是程序员manor,我希望自己能成为国家复兴道路的铺路人,大数据领域的耕耘者,平凡但不甘于平庸的人。事情是这样的我在实习僧App上发现一家公司非常匹配我的需求~城市匹配技能匹配福利匹配还是一家游戏公司ÿ... 查看详情

python中的logger和handler到底是个什么鬼(代码片段)

最近的任务经常涉及到日志的记录,特意去又学了一遍logging的记录方法。跟java一样,python的日志记录也是比较繁琐的一件事,在写一条记录之前,要写好多东西。典型的日志记录的步骤是这样的:创建logger创建handler定义formatter... 查看详情

thread.sleep到底是个什么骚操作?(代码片段)

...;Thread.sleep(0),下面就来分析一下这串看似无用的代码到底有没有用。Thread.sleep(0)到底是个什么骚操作,这睡0毫秒和不睡有什么区别吗?操作系统资源的分配策略想要去了解多线程,就先要去了解操作系统中资源... 查看详情

kubelet中的“plegisnothealthy”到底是个什么鬼?(代码片段)

原文链接:深入理解Kubelet中的PLEGisnothealthy在Kubernetes社区中,PLEGisnothealthy成名已久,只要出现这个报错,就有很大概率造成Node状态变成NotReady。社区相关的issue也有一大把,先列几个给你们看看:https://stackoverflow.com/questions/538727... 查看详情

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

   之前写过中小企业网络怎样优化建设的文章,现在随着科技的发展云计算已经逐渐成熟,中小企业以后可以不用再建立自己的机房,直接在网络上去租用各种服务就行(Iaas、Paas、Saas)。如下图:650)this.width=650;"src=... 查看详情

搞懂vue响应式原理——实现对象响应式-搞懂window.targetdep.target到底是个什么东西

代码如下:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname=" 查看详情

光天化日学c语言(23)-整数的存储|补码到底有什么用?(代码片段)

🙉饭不食,水不饮,题必须刷🙉还不会C语言,和我一起打卡!🌞《光天化日学C语言》🌞LeetCode太难?上简单题!🧡《C语言入门100例》🧡LeetCode太简单?大神盘他!🌌... 查看详情

oracle中的incarnation到底是个什么?实验操作篇(代码片段)

对于“化身”Incarnation概念了解之后,本篇通过手工恢复实验来具体操作演示,加深对Incarnation的理解,来自于博客园AskScuti。你可以点击此处查看《概念理解篇》。目录1.官方图示例2.场景模拟3.实验步骤  3.1备份数据库... 查看详情

cdn到底是个什么鬼?看完这篇你就懂了(代码片段)

...一个研究小组为改善互联网的服务质量而提出的。那么它到底是怎么改善互联网服务质量的呢?原理分析我们知道,当我们使用域名访问某一个网站时,实际上就是将请求包(以Http请求为例)通过网络传输给某台服务器,比如... 查看详情

系统可用性:sre口中的3个9,4个9...到底是个什么东西?(代码片段)

...到的一句话是你的接口有几个9?2个9?3个9?到底几个9才算是稳定呢?今天我们就从系统可用性(Availability)开始,为你讲解开发过程中那些常用的指标名称。1.系统可用性1.1-什么是系统可用性概念... 查看详情

分布式系统的“脑裂”到底是个什么玩意?(代码片段)

目前大多数项目都在往分布式上发展,一旦系统采用分布式系统,便会引入更多复杂场景和解决方案。比如,当你在系统中使用了Elasticsearch、ZooKeeper集群时,你是否了解过集群的“脑裂”现象?又是否知道它... 查看详情

分布式系统的“脑裂”到底是个什么玩意?(代码片段)

目前大多数项目都在往分布式上发展,一旦系统采用分布式系统,便会引入更多复杂场景和解决方案。比如,当你在系统中使用了Elasticsearch、ZooKeeper集群时,你是否了解过集群的“脑裂”现象?又是否知道它... 查看详情

netty系列进阶篇一:阻塞和多路复用到底是个啥?(代码片段)

...、进阶篇:Netty封装了什么?二、刨根问底:到底什么是阻塞?什么是多路复用器?1、操作系统基础1-1用户态与内核态1-2系统调用1-3FileDescriptor文件描述符1-4简单跟踪程序的系统调用过程2、多路复用的流程3、... 查看详情

一文带你搞懂rpc到底是个啥(代码片段)

RPC(RemoteProcedureCall),是一个大家既熟悉又陌生的词,只要涉及到通信,必然需要某种网络协议。我们很可能用过HTTP,那么RPC又和HTTP有什么区别呢?RPC还有什么特点,常见的选型有哪些?1.RPC... 查看详情