补码为什么要+1

news2025/1/13 13:24:54

关于补码的文章,csdn上面遍地都是,所以我们大可不必搬运别人的文章来装点门面,我写这篇博客是想补充一个问题“补码为什么要+1”的问题,这个问题,博客园有个叫张子秋的文章写的很好,但是最后对补码为什么+1的问题,我想补充得更充分一点。

我们知道,在计算机里面

正整数:补码=反码=原码

[+1] = [0000 0001]原 = [0000 0001]反 = [0000 0001]补

负整数在计算机却是用补码表示的

负整数:补码=反码+1

[-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]补 (负数补码=反码+1)

【注:最高位为符号位0表示正,1表示负】

我们来做一个计算,验证这个逻辑:

1 + 1 = 2

[0000 0001]原 + [0000 0001]原 = [0000 0010]原 = 2 没问题

[0000 0001]反 + [0000 0001]反 = [0000 0010]反 = 2 也没问题

[0000 0001]补 + [0000 0001]补 = [0000 0010]补 = 2 也没问题

【结论:正数做加法,原码=反码=补码,结果是很显然的,因为正数的原码=反码=补码,不管采用什么方式计算结果都一样】

我们再来看负数相加的情况:

1 - 1=0----> 1 + (-1) = 0

[0000 0001]原 + [1000 0001]原 = [1000 0010]原 = -2 错误

[0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0

【最后1111 1111要还原成原码1000 0000,保留符号位,原来反的再复原】

此时,出现-0这个数,虽然我们能理解0和-0是一个数,但是我们又觉得-0是没有意义的,所以作为人类杰出的发明,当然不允许作为整个人类科技的基石【计算机算科技的基石吧】出现这种没有意义的事情【不完美会让科学家们睡不着】,如果让-0存在,那么就会出现[0000 0000]表示+0,[1000 0000]表示-0,这会浪费一个数[1000 0000],我们知道,在8位字长中,最高位作为符号位,那么整个8位字长的数能表示的范围就是[1111 1111]~[0111 1111],即-127~+127,[-127,+127],这中间还有一个[1000 0000],所以应该是[-127....-0,0,+127],计算机的设计者觉得,何不把-0这个编码给到-128,让8位字长能多表示一个数?因此,表示范围变成了[-128,+127],这样看起来很完美。那,有人说为什么不让-0给+128,让表示范围变成[-127,+128],但是这个+128怎么编码?又要让最高位的符号位为0,又要表示一个大于127的数【127占满了7个位】,当然是用-0表示-128最好了,因为-128本来符号位就是1啊。

因此,1-1我们不能用反码计算【反码计算结果为-0】。

我们再用补码计算看看,

[0000 0001]补 + [1111 1111]补 = [0000 0000]补 = [0000 0000]原 = 0 【0是一个正数,0的补码,反码,原码都是0000 0000】

补码计算结果正确。

我们刚才做了一个这样得动作:

1-1= 1+(-1)这好像是把减法转成了加法,对没错,计算机就是这样来设计的。那么计算机是如何把减法转成加法的呢?虽然,我们没法搞清楚计算机里面门电路的设计原理,但是可以搞清楚这个理论依据。

计算机是如何把减法转化成加法的?

我们来做一个有意思的实验:

例:我们有一个活动定在下午6点,假设当前时间是上午9点,我们要把时钟拨到下午6点的方法,有两种,

一种是倒拨3小时,即9-3 = 6 mod 12 = 6;

还有一种是顺时针拨9小时,即9+9=18 mod 12 = 6;

在以12为模的时钟系统中,加9与减3的效果是一样的。这就很好的把减法转成加法计算了。这就是计算机需要的,因为加法的实现要比减法方便得多。

mod是模运算的意思,2 mod 12 = 2,13 mod 12 = 1, 12 mod 12 = 0,11 mod 12 = 11,

当a mod b = c,a和b都是正整数的时候,你可以把取模运算当成求余运算。

 mod运算的本质是把减法转成加法

(9-3) ≡  (9+9) mod 12 = 6,≡是同余的意思),同余的说明见下面的同余定理,这里先不影响我们理解。

那么补码为什么+1

计算机处理负数的时候,是用补码来计算的,我们上面也证明了,出现负数的时候,必须使用补码才能得出正确答案。而,计算机设计中却规定

  负数的补码 = 反码 + 1

那么这个+1是什么原理?科学家看到-0觉得不完美睡不着,我们看到科学家的补码的设计+1看不懂也睡不着。

我们重新做一遍1-1

反码计算: 1-1=1+(-1)= [0000 0001]原 + [1000 0001]原

= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0

补码计算: 1-1=1+(-1)=[0000 0001]补 + ([1111 1110]反+0000 0001 ) = [0000 0001]补+[1111 1111]补= 0

+1就对,不加1就错!

[0000 0001] + [1111 1110]反和 [0000 0001] + [1111 1111]补 有什么区别?

这里面是什么原理?

我们回到起点,计算机是想把减法转成加法,当出现负数的时候,用他的同余数来替代。【同余原理下面讲】

再回到钟表:

3-9等价于3+3,我们把-9转成了3,为什么可以这样转变

例:3点要拨到6点

一种是顺时针拨3个小时,即3+3 = 6 ;

还有一种是逆时针拨9个小时,即3-9 = 6;

注意:你很自然这样操作了!你潜意识里面做了什么?

3-9=6这个等式好像不太对,3-9=-6啊,那么6和-6为什么一样了呢?这就是模的作用?顺时针拨3和逆时针拨9,这3+9=12,12就是这个时钟系统的模。

我们再用数学知识来解释为什么-6和6重合了。

根据mod(模)的公式

X mod y = x - y* x/y ⏌-------------取模公式

验证:

6 mod 12 = 6 - 12* 6/12 ⏌ = 6 - 12*⎿ 0.5 ⏌ = 6 - 12*0 = 6 ,符号⎿ ⏌向下取整

-6 mod 12 = -6 - 12 * -6/12 ⏌ = -6 - 12 * ⎿ -0.5 ⏌ = -6 - 12*(-1) = -6+12 = 6

看到没有,6和-6 mod 12同余, 6-6 mod 12,数学真他妈伟大,所以数学才是基石的基石。【,是同余符号】

我们很自然的想到了在钟表里面,3的镜像是-9,也就是3的相反数是-9,或者说-9的相反数是3?

3 mod 12 = 3

-9 mod 12 = -9 - 12 * -9/12 ⏌ = -9 - 12 * ⎿ -0.75 ⏌ = -9 - 12*(-1) = -9+12 = 3

那么在钟表里面,-1的相反数是多少?是不是11?

-1 mod 12 = -1 - 12* -1/12 ⏌ = -1 - 12 * ⎿ -0.09 ⏌ = -1 - 12*(-1) = -1+12 = 11

我们再回到上面1-1的计算中,按照钟表的原理,那么在计算机中-1的镜像是多少?是不是应该是127?

你为什么会想到127?为什么这么自然?

-1的反码是 [1000 0001]原---->[1111 1110]反,这个数如果不看符号位,是多少?是126.

按照钟表的原理,-1的反码不是127吗?

所以,我们要在[1111 1110]反码的基础上再加1【-1的反码是126,补码才是127】,而用补码来表示反码加1.

还是有点牵强!感觉是为了凑这个数。

-1和126有什么关系?【126是取反过来的,为什么要取反?计算机为什么这样设计?】

我们换一种思路:

-1 mod 127 = 126,用数学来解释才是硬道。

-1 mod 127 = -1 - 127* -1/127 ⏌ = -1 - 127*⎿ -0.008 ⏌ = -1 -127*(-1)=-1+12=126

问题来了,我们上面不是很自然的认为-1的镜像是127吗,为什么我们用数学公式算出来是126?

这就是潜意识里面把模自然当成了128所以,得出-1的相反数是127.

                模为127

                  模为128

那为什么不能让-1的相反数直接反过来就等于127呢?

这个做不到,我们看原因

-1反=[1000 0001]原反 = [1111 1110]反=126,而127是[1111 1111](不考虑符号位)

所以,原码取反之后,无法得到127,必须在反的基础上再加1刚好是127。

加1的本质是什么?

加1的本质是让模变成128,这是重点。

那么为什么+1就让模变成了128呢?

我们仔细看上面钟表这个图,当模是127时,表盘上的最大刻度只能是126,如果要让表盘的最大刻度变成127,模必须是128,好好理解这就话。

也许有人说,唉,我用127照样可以对127取模啊,并不是只有小于模的数才可以对该模取模啊。我们要这样想,在模为127的数里面,就没有127这个数,到了127又是一轮了,又归零了,如果你还不好理解,你把模当进制来理解,两个10进制数列竖式计算,里面就不能出现10,满10要进位。

你还可以用127 mod 127 实际上等于0,还是归位到其实位置。

所以,我们在用-1进行计算机运算的时候,必须在反码的基础上加1,只不过我们给这个操作定义一个名字叫补码,本质上是因为-1取反后只能等于126,得不到127才加1的。(加1自然就让mod变成128了)

其实,8位字长的模取值范围是[-128,+127]这个范围的数的模就是128.

【其他字长的原理其实也一样,16位,32位,64位】

至此,补码为什么+1这个问题就解释到这里,不知你是否理解了。

同余定理

两个整数a,b,如果分别除以整数m,得到的余数相等,则称a,b 模 m同余,模常用mod替代。记作:

a ≡ b mod m,≡是同余符号,a和b可以是负数,m一般是正整数(0肯定不可以,不知负数有上面意义,没有去研究)

同余是数论中非常重要的一块,是由德国数学家高斯发明的(1777~1855),其中同余符号≡就是他发明的

同余里面的定理:

(1)反身性(Reflexive Property):若a是整数,则a≡a(mod m);

这个性质很容易理解,11 mod 7 = 4,11 mod 7 = 4,当然11和11 mod 7 同余;

(2)对称性(Symmetric Property):若a和b是整数,且a≡b(mod m),则b≡a(mod m);

11 mod 7 = 4, 4 mod 7 = 4, 11 ≡ 4 mod 7同余,4 ≡ 11 mod 7也同余

(3)传递性(Transitive Property):若a、b和c是整数,且a≡b(mod m)和b≡c(mod m),则a≡c(mod m)。

4 mod 7 = 4, 11 mod 7 = 4, 18 mod 7 = 4,

4 ≡ 11 mod 7,11 ≡ 18 mod 7------> 4 ≡ 18 mod 7

基本模运算

(1)若a≡b(mod m),c≡d(mod m),则a±c≡b±d(mod m);

        4 ≡ 11 mod 7 = 4

        -3 ≡ 18 mod 7 = 4

        1(4+(-3))≡29(11+28) mod 7 = 1, 7(4-(-3))≡-7(11-18) mod 7 = 0

        1(4-3) !≡ -7(11-18) mod 7 前面是a+b后面是a-b这样不同余

(2)若a≡b(mod m),c≡d(mod m),则a×c≡b×d(mod m);

        4 ≡ 11 mod 7 = 4

        2 ≡ 9 mod 7 = 2

        8 ≡ 99 mod 7 = 1

(3)若a≡b(mod m),且n∈N,     

        2 ≡ 7 mod 5 = 2, 4 ≡ 49 mod 5 = 4 , 8 ≡ 343 mod 5 = 3

(4)若a≡b(mod m),且k是整数,则k×a≡k×b(mod m);

        2 ≡ 7 mod 5 = 2, 4 ≡ 14 mod 5 = 4,6 ≡ 21 mod 5 = 1

(5)若a≡b(mod m),且m=qn,则a≡b(mod n)

        3 ≡ 15 mod 12 = 3, 12=3x4, 3 ≡ 15 mod 4 = 3, 3≡ 15 mod 3 = 0

        同余定理的目的不是捣鼓这些变换,而是解决问题:比如

Q1)求2的90次方 除以11的余数

红线标注部分,属于取模的一些性质,这些性质可以通过下面的例子看出:

4 mod 11 = 4,有 (4+11) mod 11 = 4,也有 (4 - 11)mod 11 = 4 也就是任何一个数加减n倍的mod的 余数不变,类似钟表6点钟,转一圈还是回到6点,不管是正转还是反转,也不管是转多少圈。

Q2)求1992×59除于7的余数

13 mod 7 = 6 ,有 (1*7 + 6) mod 7 也等于6

9 mod 7 = 2,有(1*7 + 2) mod 7 也等于2

13x9 mod 7 = 117 mod 7 = 5

(1*7+6) x (1*7+2) mod 7 = 2*6 mod 7 = 12 mod 7 = 5

所以,1992x59 mod 7 = (1992%7) x (59%7) mod 7 = 4x3 mod 7 = 12 mod 7 = 5

或者,可以这样理解,1992x59 mod 7 = (284*7+4)x(7*8+3) mod 7 = 4x3 mod 7 = 5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1137144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【VASP】POTCAR文件

【VASP】POTCAR文件 POTCAR 文件的介绍qvasp 生成POTCARvaspkit 生成POTCAR再来认识一下各种赝势如何区分US、PAW、LDA、GGA、PW91 前言 一、4个常用的输入文件INCAR、POSCAR、POTCAR、KPOINTS INCAR: 计算任务类型是什么?怎么计算? KPOINTS: 包含了倒易…

Decomposed Meta-Learning for Few-Shot Named Entity Recognition

原文链接: https://aclanthology.org/2022.findings-acl.124.pdf ACL 2022 介绍 问题 目前基于span的跨度量学习(metric learning)的方法存在一些问题: 1)由于是通过枚举来生成span,因此在解码的时候需要额…

Zoho Mail荣登福布斯2023年企业邮箱榜单,引领行业新方向!

几十年来,电子邮件一直是电子通信的重要形式,并且在未来的许多年里,它可能会无处不在。尽管有大量免费电子邮件服务可供用户和企业使用,但其中许多服务缺乏专门的功能,例如适合办公室使用的集中管理。 福布斯小型企业顾…

S5PV210裸机(七):Nand和iNand

本文主要探讨210Nand和iNand相关知识。 NandFlash 型号与命 K9F2G08:K9F为发行商,2G为Nand大小是2Gbit(256MB),08为Nand是8位(8数据线即接口为8位:传输数据,地址,命令) 功能 Nand是矩阵式存储,每块可存1bit位 …

3.SpringSecurity基于数据库的认证与授权

文章目录 SpringSecurity基于数据库的认证与授权一、自定义用户信息UserDetails1.1 新建用户信息类UserDetails1.2 UserDetailsService 二、基于数据库的认证2.1 连接数据库2.2 获取用户信息2.2.1 获取用户实体类2.2.2 Mapper2.2.3 Service 2.3 认证2.3.1 实现UserDetails接口2…

探索跨境电商产品开发流程的最佳工具

产品是跨境电商行业的核心竞争力,一个完整的新产品开发过程,大致要经历创意生成 - 创意筛选 - 产品概念开发与测试 - 营销策划 - 业务分析 - 产品实体开发 - 试销 - 商业化这8个阶段。 上述每个阶段都很重要且需要在实操中不断完善,当中涉及…

十九、类型信息(1)

本章概要 为什么需要 RTTI RTTI(RunTime Type Information,运行时类型信息)能够在程序运行时发现和使用类型信息 RTTI 把我们从只能在编译期进行面向类型操作的禁锢中解脱了出来,并且让我们可以使用某些非常强大的程序。对 RTTI …

Active learning Tiny Review for autonomous driving

Introduction 阅读某一特定主题的一本书不会使你成为专家,阅读多本包含相似内容的书也不会。真正掌握一项技能或领域的知识需要来自多样化信息源的大量信息。 这对于自动驾驶和其他人工智能技术同样适用。 负责自动驾驶功能的深度神经网络需要经过详尽的训练&#…

ES 数据迁移最佳实践

ES 数据迁移最佳实践与讲解 数据迁移是 Elasticsearch 运维管理和业务需求中常见的操作之一。以下是不同数据迁移方法的最佳实践和讲解: 一、数据迁移需求梳理 二、数据迁移方法梳理 三、各方案对比 方案 优点 缺点(限制) 适用场景 是否有…

Lua脚本语言

1. 概念 Lua(发音为"loo-ah",葡萄牙语中的"lua"意为月亮)是一种轻量级的、高效的、可嵌入的脚本编程语言。官网Lua最初由巴西计算机科学家Roberto Ierusalimschy、Waldemar Celes和Luiz Henrique de Figueiredo于1993年开…

看完这篇 教你玩转渗透测试靶机Vulnhub——Hacksudo: Aliens

Vulnhub靶机Bluemoon: 2021渗透测试详解 Vulnhub靶机介绍:Vulnhub靶机下载:Vulnhub靶机安装:Vulnhub靶机漏洞详解:①:信息收集:②:数据库后台传木马:③:反弹shell&#x…

免费活动-11月4日敏捷武林上海站 | Scrum.org CEO 亲临现场

​​​​​​​ 活动介绍 过去的几年里,外界的风云变幻为我们的生活增添了一些不一样的色彩。在VUCA世界的浪潮里,每一个人都成为自己生活里的冒险家。面对每一次的变化,勇于探索未知,迎接挑战,努力追逐更好的自己。…

实现地址转换的硬件机构

一、基本地址变换机构 1.硬件: 设置一个页表寄存器,存放页表在内存中的起始地址与页表长度。 2.执行过程: 进程未执行时,页表起始地址和长度存放在进程控制块(PCB)中;进程被调度时,OS内核会将其放入页表寄存器中。 3.具…

海外广告投放必看,如何使用Quora广告开拓新流量市场?

虽然在Quora 上学习广告相对容易,但需要大量的试验和错误才能找出最有效的方法。一些广告技巧可以让您的工作更有效率。这篇文章将介绍如何有效进行quora广告投放与有价值的 Quora 广告要点,这将为您节省数万美元的广告支出和工作时间!往下看…

postgresSQL 数据库本地创建表空间读取本地备份SQL文件

使用pgAdmin4,你安装PG得文件夹****/16/paAdmin 4 /runtime/pgAdmin4.exe 第一步:找到Tablespaces 第二步:创建表空间名称 第三步:指向数据文件 第四步:找到Databases,创建表空间 第五步:输入数…

SpringBoot依赖和代码分开打包

前言 在公司的项目中,一个SpringBoot工程可能就上百MB,这时候当线上网速不佳的时候,部署起来就十分的痛苦了。。经常等好久才能上传完毕,接下来我来教大家一个SpringBoot工程代码和依赖分开打包的方法。这种方法将依赖和代码分开…

身份证号码,格式校验:@IdCard(Validation + Hutool)

目标 自定义一个用于校验 身份证号码 格式的注解IdCard,能够和现有的 Validation 兼容,使用方式和其他校验注解保持一致(使用 Valid 注解接口参数)。 校验逻辑 有效格式 符合国家标准。 公民身份号码按照GB11643-…

NOIP2023模拟2联测23 分神

题目大意 有 n n n个矩形,每个矩形的四条边都平行于坐标轴。对于一个矩形,它的左下角坐标为 ( x 1 , y 1 ) (x_1,y_1) (x1​,y1​),右上角坐标为 ( x 2 , y 2 ) (x_2,y_2) (x2​,y2​),包含了所有满足 x 1 ≤ x ≤ x 2 , y 1 ≤ …

app分发的一些流程2

应用分发的流程通常包括以下步骤: 开发应用程序:首先,您需要开发您的应用程序。这包括编写代码、设计用户界面、测试应用程序等等。确保您的应用程序符合各个应用商店的规范和要求,以确保顺利通过审核。 准备应用材料&#xff1…

Android 13.0 自定义仿小米全面屏手势导航左右手势滑动返回UI效果

1.概述 在13.0的系统产品开发中,对于设置默认系统手势的左右滑动返回UI,系统默认的是比较简单,产品需求要求仿小米华为的左右手势返回UI样式的定制,所以需要找到绘制手势返回UI的相关代码,然后自定义手势导航左右滑动返回的相关UI就可以了 接下来就来实现手势导航做好手势…