计算机编码:原码、反码、补码的思想、原理和实例(详细版)

news2024/11/28 22:47:39
目录
收起
一、原码、反码、补码的意义
意义:
三、原码
原码的特点:
原码存在的问题:
四、反码
反码的特点:
存在的问题:
五、补码
六、补码的思想(模&&同余数)
模 && 同余数:
七、补码的实例
补码的特点:
八、为什么负数的补码的求法是反码+1
计算公式:
为什么补码表示正数少一位, 而负数多一个数, 例如4位, 正数是0~127, 负数是-1~-128
九. 移码

一、原码、反码、补码的意义

由于计算机的硬件决定,任何存储于计算机中的数据,其本质都是以二进制码存储

根据冯·诺依曼提出的经典计算机体系结构框架,一台计算机由运算器、控制器、存储器、输入和输出设备组成。其中运算器只有加法运算器,没有减法运算器(据说一开始是有的,后来由于减法运算器硬件开销太大,被废了)。

所以计算机中没办法直接做减法的,它的减法是通过加法实现的。现实世界中所有的减法也可以当成加法的,减去一个数可以看作加上这个数的相反数,但前提是要先有负数的概念,这就是为什么不得不引入一个符号位。符号位在内存中存放的最左边一位,如果该位位0,则说明该数为正;若为1,则说明该数为负。

而且从硬件的角度上看,只有正数加负数才算减法,正数与正数相加,负数与负数相加,其实都可以通过加法器直接相加。

意义:

原码、反码、补码的产生过程就是为了解决计算机做减法和引入符号位的问题。

三、原码

原码:是最简单的机器数表示法,用最高位表示符号位,其他位存放该数的二进制的绝对值

以带符号位的四位二进制数为例:1010,最高位为1表示这是一个负数,其它三位010,即0*2^2+1*2^1+0*2^0=2,所以1010表示十进制数-2。

部分正负数的二进制原码表示

原码的表示法很简单,虽然出现了+0和-0,但是直观易懂。于是开始运算——

0001+0010=0011,1+2=3;
0000+1000=1000,+0+(-0)=-0;
0001+1001=1010,1+(-1)=-2。

于是可以看到其实正数之间的加法通常是不会出错的,因为它就是一个很简单的二进制加法,而正数与负数相加,或负数与负数相加,就要引起莫名其妙的结果,这都是符号位引起的。0分为+0和-0也是因它而起。

原码的特点:

1. 原码表示直观、易懂,与真值转换容易。

2. 原码中0有两种不同的表示形式,给使用带来了不便。

通常0的原码用+0表示,若在计算过程中出现了-0,则需要用硬件将-0变成+0。

3. 原码表示加减运算复杂。(存在的问题)

利用原码进行两数相加运算时,首先要判别两数符号,若同号则做加法,若异号则做减法。在利用原码进行两数相减运算时,不仅要判别两数符号,使得同号相减,异号相加;还要判别两数绝对值的大小,用绝对值大的数减去绝对值小的数,取绝对值大的数的符号为结果的符号。可见,原码表示不便于实现加减运算。

原码存在的问题:

原码解决了计算机只有加法运算器进行运算的问题,不便进行加减运算。

四、反码

原码最大的问题就在于一个数加上它的相反数不等于0,于是反码的设计思想就是冲着解决这一点,既然一个负数是一个正数的相反数,那干脆用一个正数按位取反来表示负数。

反码:正数的反码还是等于原码;负数的反码就是它的原码除符号位外,按位取反

以带符号位的四位二进制数为例:3是正数,反码与原码相同,则可以表示为0011;-3的原码是1011,符号位保持不变,低三位按位取反,所以-3的反码为1100

部分正负数的二进制反码表示

再试着用反码的方式解决一下原码的问题——

0001+1110=1111,1+(-1)=-0; //正确
1110+1100=1010,(-1)+(-3)=-5。//此处应该是-4

互为相反数相加等于0,虽然的到的结果是1111也就是-0。但是两个负数相加的出错了

反码的特点:

  1. 在反码表示中,用符号位表示数值的正负,形式与原码表示相同,即0为正;1为负。
  2. 在反码表示中,数值0有两种表示方法。
  3. 反码的表示范围与原码的表示范围相同。

反码表示在计算机中往往作为数码变换的中间环节。

存在的问题:

反码解决了正负相加, 但负负相加结果错误;

五、补码

补码的出现是为了解决负数计算的问题, 不影响正数, 所以正数的补码是本身,负数补码有变化。

补码:正数的补码等于它的原码;负数的补码等于反码+1(这只是一种算补码的方式,多数书对于补码就是这句话)。

其实负数的补码等于反码+1只是补码的求法,而不是补码的定义,很多人以为求补码就要先求反码,其实并不是,那些计算机学家并不会心血来潮的把反码+1就定义为补码,只不过补码正好就等于反码+1而已。

如果有兴趣了解补码的严格说法,建议可以看一下《计算机组成原理》,它会用“模”和“同余”的概念,严谨地解释补码。

六、补码的思想(模&&同余数)

补码的思想,第一次见可能会觉得很绕,但是如果肯停下来仔细想想,绝对会觉得非常美妙。

补码的思想其实就是来自于生活,只是我们没注意到而已,如时钟、经纬度、《易经》里的八卦等。补码的思想其实就类似于生活中的时钟

如果说现在时针现在停在10点钟,那么什么时候会停在八点钟呢?

简单,过去隔两个小时的时候是八点钟,未来过十个小时的时候也是八点钟。
也就是说时间倒拨2小时,或正拨10小时都是八点钟。
也就是10-2=8,而且10+10=8。
这个时候满12,说明时针在走第二圈,又走了8小时,所以时针正好又停在八点钟。

所以12在时钟运算中,称之为,超过了12就会重新从1开始算了。

也就是说,10-2和10+10从另一个角度来看是等效的,它都使时针指向了八点钟。

既然是等效的,那么在时钟运算中,减去一个数,其实就相当于加上另外一个数(这个数与减数相加正好等于12,也称为同余数),这就是补码所谓运算思想的生活例子。

在这里,再次强调原码、反码、补码的引入是为了解决做减法的问题。在原码、反码表示法中,我们把减法化为加法的思维是减去一个数等于加上这个数的相反数,结果发现引入符号位,却因为符号位造成了各种意想不到的问题。

但是从上面的例子中,可以看到其实减去一个数,对于数值有限制、有溢出的运算(模运算)来说,其实也相当于加上这个数的同余数。

也就是说,不引入负数的概念,就可以把减法当成加法来算。

对于数值有限制、有溢出的运算(模运算)来说,其实也相当于加上这个数的同余数

模 && 同余数:

数论中的重要概念。给定一个正整数m,如果两个整数a和b满足a-b能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(mod m)。对模m同余是整数的一个等价关系。

例如:12小时为时间的模,b = 2, a = 2%12 = 10

简单,过去隔两个小时的时候是八点钟,未来过十个小时的时候也是八点钟。 也就是说时间倒拨2小时,或正拨10小时都是八点钟。 也就是10-2=8,而且10+10=8。 这个时候满12,说明时针在走第二圈,又走了8小时,所以时针正好又停在八点钟。
问题:现在是10点, 过去2个小时是几点?
算术计算: 10 - 2 = 8
计算机没有减法: 减去一个数等于加上一个数的同余数
10 - 2 = 10 + 2的同余数 
2的同余数 = 2%12 = 10 =>
10 - 2 = 10 + 2的同余数 = 10 + 10 = 20

七、补码的实例

接下来就做一做四位二进制数的减法(先不引入符号位)。

0110-0010,6-2=4,但是由于计算机中没有减法器,没法算。

这时候,想想时钟运算中,减去一个数,是可以等同于加上另外一个正数(同余数),这个数与减数相加正好等于模。

四位的模: 其实就是2^4=16(二进制10000)。

  • -2的同余数 = 10000(模)- 0010 = 1110,16-2 = 14。
  • 所以,0110-0010=0110+1110=10100,6-2=6+14=20。

按照这种算法得出的结果是10100,但是对于四位二进制数最大只能存放4位,如果低四位正好是0100,正好是想要的结果

但是减去2,从另一个角度来说,也是加上-2,即加上-2和加上14得到的二进制结果除了进位位,结果是一样的。如果我们把1110(-2的同余数)的最高位看作符号位后就是-2的补码,这可能也是为什么负数的符号位是1,而不是0

到这里,原码、反码的问题,补码基本解决了。

在补码中也不存在-0了,因为1000表示-8。

补码的特点:

1. 在补码表示中,用符号位表示数值的正负,形式与原码的表示相同,即0为正,1为负。但补码的符号可以看做是数值的一部分参加运算。

正数的补码表示就是其本身,负数的补码表示的实质是把负数映像到正值区域,因此加上一个负数或减去一个正数可以用加上另一个数(负数或减数对应的补码)来代替。
从补码表示的符号看,补码中符号位的值代表了数的正确符号,0表示正数,1表示负数;而从映像值来看,符号位的值是映像值的一个数位,因此在补码运算中,符号位可以与数值位一起参加运算。

2. 在补码表示中,数值0只有一种表示方法。

3. 负数补码的表示范围比负数原码的表示范围略宽。纯小数的补码可以表示到-1,纯整数的补码可以表示到-2^n。

由于补码表示中的符号位可以与数值位一起参加运算,并且可以将减法转换为加法进行运算,简化了运算过程,因此计算机中均采用补码进行加减运算

八、为什么负数的补码的求法是反码+1

因为负数的反码加上这个负数的绝对值正好等于1111,在加1,就是10000,也就是四位二进数的模,

而负数的补码是它的绝对值的同余数,可以通过模减去负数的绝对值得到它的补码,所以负数的补码就是它的反码+1。

  • 减去一个数 等于 加上一个数的同余数
  • 减去一个数 等于 加上一个负数

计算公式:

模 = 负数的反码 + 负数的绝对值 + 1

例如:模 =  -2的反码 + -2的绝对值 + 1 = 1101 +0010 +1 = 1111 + 1 = 10000

负数的补码 = 绝对值的同余数 = 模 - 负数的绝对值

= (负数的反码 + 负数绝对值 + 1) - 负数的绝对值

= 负数的反码 + 1

所以:

负数的补码 = 反码 + 1


为什么补码表示正数少一位, 而负数多一个数, 例如4位, 正数是0~127, 负数是-1~-128

答:编码的发展经历: 原码 -> 反码 -> 补码的过程;

在反码时代, 有正0和负0, 如果是4位编码的话,既0000和1000, 由于反码负数计算问题又发明了补码, 正数计算不受影响, 在补码时代正数补码仍然是本身, 表示范围是所以0~127, 而反码的负0在补码时代变成了-128;

所以补码表示范围:正数是0~127, 负数是-1~-128。


九. 移码

在计算机浮点数的表示是采用尾数+阶码的方式表示, N=M*2^E, 其中阶数E采用移码表示。

公式:移码 = 补码的符号位取反

移码的表示方法是:

在偏移2n-1的情况下只要将补码的符号位取反便可获得相应的移码表示。

[+1] = [00000001]原 = [00000001]反 = [00000001]补 = [10000001]移
[-1] = [10000001]原 = [11111110]反 = [11111111]补 = [01111111]移

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

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

相关文章

exF2FS: Transaction Support in Log-Structured Filesystem——泛读笔记

FAST 2022 Paper 分布式元数据论文汇总 问题 现代应用程序努力以崩溃一致的方式保护其数据,这通常分布在多个文件抽象之上。在底层文件系统缺乏事务支持的情况下,应用程序使用复杂的协议来确保跨多个文件的事务性更新,产生长序列的写操作和…

小林Coding_操作系统_读书笔记

一、硬件结构 1. CPU是如何执行的 冯诺依曼模型:中央处理器(CPU)、内存、输入设备、输出设备、总线 CPU中:寄存器(程序计数器、通用暂存器、指令暂存器),控制单元(控制CPU工作&am…

自研人工智能小工具-小蜜蜂(国外ChatGpt的平替)

国内有非常多好用的人工智能工具,但均无法完全替代国外ChatGpt。 ChatGPT相较于其他国内工具的优势在于以下几点: 创新的语言生成能力:ChatGPT是由OpenAI开发的先进的自然语言生成模型,它采用了大规模的预训练和精细调整方法。因此…

蓝桥杯刷题day06——平均

1、题目描述 有一个长度为n 的数组(n 是 10 的倍数),每个数ai都是区间 [0,9] 中的整数。 小明发现数组里每种数出现的次数不太平均,而更改第i 个数的代价为bi, 他想更改若干个数的值使得这10 种数出现的次数相等&…

创建TextMeshPro字体文件

相比于Unity的Text组件,TextMesh Pro提供了更强大的文本格式和布局控制,更高级的文本渲染技术,更灵活的文本样式和纹理支持,更好的性能以及更易于使用的优点。但unity自带TextMeshPro字体不支持中文。这里使用普通字体文件生成Tex…

前端登陆加密解决方案

项目背景 环食药烟草的数据下载模块中,需要判断用户在进行数据下载时是进行了登录操作,如果没有登录要跳转登陆页面,输入账号和密码进行登录。 使用场景 项目中需要前端书写登录页面,用户输入账号密码,前端获取到用…

Allegro中设置让Route Keepout(禁止布线区)允许布线或打过孔的方法

Allegro中设置让Route Keepout(禁止布线区)允许布线或打过孔的方法 Chapter1 Allegro中设置让Route Keepout(禁止布线区)允许布线或打过孔的方法一、前言二、设置方法 Chapter2 Cadence Allegro PCB设计88问解析(二十三) 之 Alleg…

QT中QComboBox添加点击事件,实现下拉框自动刷新

因为项目需要,在QT中的ui界面添加QComboBox控件,需求是实现控件的点击事件,查了资料,发现这个控件类的本身是没有点击信号可以使用的。 但是QT是基于C的面向对象,有了这个特点,我们就可以继承原来的类&…

认识Tomcat (一)

认识Tomcat (一) 一、服务器 1.1 服务器简介 ​ 硬件服务器的构成与一般的PC比较相似,但是服务器在稳定性、安全性、性能等方面都要求更高,因为CPU、芯片组、内存、磁盘系统、网络等硬件和普通PC有所不同。 ​ 软件服务器&…

Docker 搭建mysql 集群(二)

PXC方案 很明显 PXC方案在任何一个节点写入的数据都会同步到其他节点,数据双向同步的(在任何节点上都可以同时读写) 创建MySQL PXC集群 1 安装PXC镜像 docker pull percona/percona-xtradb-cluster:5.7.21 2 为PXC镜像改名 docker tag pe…

从零开始手写mmo游戏从框架到爆炸(三)— 服务启动接口与网络事件监听器

上一章我们完成了netty服务启动的相关抽象(https://blog.csdn.net/money9sun/article/details/136025471),这一章我们再新增一个全局的服务启动类,方便后续扩展。 服务启动 新增的两个类如下: 定义一个接口IServer …

react native错误记录

第一次运行到安卓失败 Could not find implementation class com.facebook.react.ReactRootProjectPlugin for plugin com.facebook.react.rootproject specified in jar:file:/D:/Android_Studio_Data/.gradle/caches/jars-9/o_3a1fd35320f05989063e7069031b710f/react-nativ…

Linux命令·

debian linux: deb 软件包 deb软件包分为两种,.deb二进制软件包,.dsc源码包 软件包的两种管理工具 1.dpkg 软件包软件的安装包必须存在 不能从镜像点获得安装包 不能检测软件之间的依赖关系 dpkg -i package.deb #安装包 dpkg -r package …

Elasticsearch:使用 Inference API 进行语义搜索

在我之前的文章 “Elastic Search 8.12:让 Lucene 更快,让开发人员更快”,我有提到 Inference API。这些功能的核心部分始终是灵活的第三方模型管理,使客户能够利用当今市场上下载最多的向量数据库及其选择的转换器模型。在今天的…

SpringBoot 登录检验JWT令牌 生成与校验

JWT官网 https://jwt.io/ 引入依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>设置过期时间 LocalDateTime localDateTime LocalDateTime.now().…

uniapp中使用EelementPlus

uniapp的强大是非常震撼的&#xff0c;一套代码可以编写到十几个平台。这个可以在官网上进行查询uni-app官网。主要还是开发小型的软件系统&#xff0c;使用起来非常的方便、快捷、高效。 uniapp中有很多自带的UI&#xff0c;在创建项目的时候&#xff0c;就可以自由选择。而E…

React Native学习记录

一、创建RN项目的时候是空文件夹的问题 1.使用npx react-native init RNDemos初始化项目的时候&#xff0c;会报错&#xff0c;模版错误&#xff0c;然后创建出来一个空的文件夹 2.如果出现这种情况&#xff0c;需要设置npm install -g react-native-cli 3.安装完成以后再次初…

python 多线程编程(一)

文章目录 threading - 基于线程的并行线程对象thread 类thread方法thread 属性例子 锁对象递归锁对象 条件对象 队列Queue对象SimpleQueque 对象例子 最近的工作需要用到多线程提升程序的运行效率&#xff0c;以前一直没有机会进行多线程编程&#xff0c;所以一直没有机会学习p…

QEMU源码全解析 —— 内存虚拟化(2)

接前一篇文章&#xff1a; 本文内容参考&#xff1a; 《趣谈Linux操作系统》 —— 刘超&#xff0c;极客时间 《QEMU/KVM》源码解析与应用 —— 李强&#xff0c;机械工业出版社 QEMU内存管理模型 特此致谢&#xff01; QEMU内存初始化 1. 基本结构 在开始介绍内存初始化…

[Python] 什么是KMeans聚类算法以及scikit-learn中的KMeans使用案例

什么是无监督学习&#xff1f; 无监督学习是机器学习中的一种方法&#xff0c;其主要目的是从无标签的数据集中发现隐藏的模式、结构或者规律。在无监督学习中&#xff0c;算法不依赖于任何先验的标签信息&#xff0c;而是根据数据本身的特征和规律进行学习和推断。无监督学习…