原码反码补码移码的目的

2023-12-21 09:48

本文主要是介绍原码反码补码移码的目的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

不涉及定点、浮点运算。范围仅在整数的数据表示里。

使用比喻,使用相似的思维就可理解其共性,这篇我就想这么写。
计算方法是设计出来的,方法因为什么要这样设计的思维和目的才是我们学习时的主线。
唐朔飞那本教材太高估我的智商,上来就是小数的,补码的全是抽象的计算,都不给几个例子(这,给初学者的教材?)……


我们先用8位二进制数来表示数值

真值原码补码(负数时,反码+1)反码(负数时,原码除了符号位都取反)移码 (补码符号位抄取反)
-51,000 01011,111 10111,111 10100,111 1011
+50,000 01010,000 01010,000 01011,000 0101

注意,“逗号”用于区分符号位和其他位,实际并不存在。


明确提出几个需要解决的问题

1.符号位会参与运算
2.所有减法运算都需要变成加法
3.有限的存储位数

解决问题1的原理——映射
人为规定从[-128, 127]到[0, 255]的映射,就可以"仅用正数表示负数"
再规定一个易于直接比较大小的映射(移码)便于比较大小。

解决问题2、3的原理——取模运算
取模后是“补”,加上映射后就对应了相应的正负数
取模本身就是一种位数限制

类似于角度数,
在同圆内60°= -300°,取模运算,此处模是360.(整数范围内,从0到359,按照360=0算)
在一字节8位内中除了符号位的7位,
1111 1111=0000 0000,取模运算,此处模是1 0000 0000(没有超过这个模的数,十进制下你见过某位是十的吗?)

再放一个表格对比悟一下

原码表示的真值(无符号位)原码表示的真值(有符号位)补码表示的真值(谁取反+1后是“码”)
1111 1111255-127原码1000 0001,表示-1

设计这种表示方式的目的(遇到问题,发明工具,解决问题)

真值

给出一个数
3(十进制)——真值

无符号二进制数

将3(十进制)表示为二进制
0011——无符号二进制数

原码

但是要考虑正负号怎么办?取最高位为符号位!
0,011——原码
啊哈,那么负3(十进制)就是
1,011——原码

补码

我想算5(十进制)-3(十进制)怎么办?
0,101
1,011
这两个数无法直接进行操作得结果!!
给一个映射,正数仍是它本身,负数取模!让负数加上它的取模的值等于1 0000!——实现从[-8,7]到[0, 15]的映射
(模是比最高位大一位的,如十进制的模是10,没有单个位能大于等于10)

补码(为什么按位取反再加一)
我喜欢博主的这句话——“因为你想要的,不是1+1=2,而是,1+1为什么等于2。当然,我们不讨论1+1的问题。我们讨论的,是补码。”
这篇博客总结一下就是【正数+(反码+1)=0 即 负数=(反码+1)】
——按着这么想,正数的映射它本身,负数先所有位取反(包括符号位)
那么比如0010(+2)的反码是1101,相加由于每位都是反,结果为1111,
为了让正数与负数相加“成为0”,就可以再加1成为1 0000,取模为0000,即“相反数相加为零”

于是得-3(十进制)的以1 0000为模的值=1 0000-1011=0 0101
0,101
符号位再按照负的来【1 0000=1111 +1,就可以看成“取反+1”】
1,101——补码

6(十进制)-3(十进制)就可以是
0,110
1,101
求和就是10011,再对1 0000取模就是 0011(是个正补码,正补码等于原码)。
0,011——计算结果的原码(+3)

1(十进制)-3(十进制)就可以是
0,001
1,101
求和就是1110,再对1 0000取模就是 1110(是个负补码)。【补码计算后的仍是补码10011,得结果原码是负数时需要“减一取反”】
对1110“减一”可得1101,再“取反”可得1,010
1,010——计算结果的原码(-2)

移码

在原码比较时
0,011(+3)
1,010(-2)
表示成无符号二进制数时
0011(3)
1010(10)
显然是不合常理的
鉴于边界值都规定好了,可以确定1打头的都是负数、0打头的都是整数——换一下不就好了??
1011—— +3的移码
0010—— -2的移码
这样,原码在无符号二进制数的映射就是合理的了


养料:

摘自:原码、反码、补码的产生、应用以及优缺点有哪些?——何新宇
补码来历的描述,可以总结如下:
1.计算机里面,只有加法器,没有减法器,所有的减法运算,都必须用加法进行
2.用补数代替原数,可把减法转变为加法。
3.出现的进位就是模,此时的进位,就应该忽略不计。
4.二进制下,有多少位数参加运算,模就是在 1 的后面加上多少个 0。
补码就是按照这个要求来定义的:正数不变,负数即用模减去绝对值。

摘自:原码、反码、补码的产生、应用以及优缺点有哪些?——张天行

所谓原码就是机器数,是加了一位符号位的二进制数,正数符号位为0,负数符号位为1,计算机中存储、处理、运算的数据通常是8位、16位、32位或64位的,这里以最简单的8位为例讲解。注意符号位是包含在8位中的其中1位,故可直观读出的数只有7位(只有后7位数可以按权展开)。有心人可能注意到原码是有缺陷的,它只能表示255种状态,因为00000000(+0)和10000000(-0)其实是一个数,因此原码的表示范围成了-127到+127,这个问题需要神奇的补码来解决,因为在补码中10000000被用来表示-128。
所谓反码,英语里又叫ones’ complement(对1求补),这里的1,本质上是一个有限位计数系统里所能表示出的最大值,在8位二进制里就是11111111,在1位十进制里就是9,在3位十六进制里就是FFF(再大就要进位了)。求反又被称为对一求补,用最大数减去一个数就能得到它的反,很容易看出在二进制里11111111减去任何数结果都是把这个数按位取反,0变1,1变零,所以才称之为反码。用原码求反码的方法是,正数不变,负数保留符号位1不变,剩下位按位取反。
所谓补码,英语里又叫two’s complement(对2求补),这个2指的是计数系统的容量(模),就是计数系统所能表示的状态数。对1位二进制数来说只有0和1两种状态,所以模是10也就是十进制的2,对7位二进制数来说就是10000000,这个模是不可能取到的,因为位数多一位。用模减去一个数(无符号部分)就能得到这个数的补,比如10000000-1010010=0101110,事实上因为10000000=1111111+1,稍加改变就成了(1111111-1010010)+1,所以又可以表述为先求反再加1。总结求补码的方法就是正数依旧不变,负数保留符号位不变,先求反码再加上1。
记住了怎么求补码,接下来讲讲运算。通过原码的符号位和数值,我们能迅速指出它代表的数,判断其正负并进行四则运算,相比而言反码和补码对于人则显得过于晦涩。如果说原码是给人看的数字语言,那么补码就是计算机的数字语言。计算机不需要知道什么是正负、大小,这些判断对它而言过于复杂。事实上它存储、处理、传输的数都只有补码一种形式,人所做的加减乘除,在计算机里只通过相加和移位就能解决,这都来自于补码系统的内在自洽和巧夺天工的神奇魔力,也是后文要阐述的重点。
对加法和减法,按上文的方法求得补码之后,直接相加就可以了,但相加的时候符号位一定要一起参与运算,有时候,两符号位相加或者接受来自低位的进位会发生溢出,就扔掉溢出的一位(稍后会解释为什么),由新的符号位决定结果的正负,如果是0表示正数,结果就是原码,如果是1表示负数,结果还要再求补数得到原码。

摘自:补码对应128
将负数用补码表示,实际上是实现了一种从[-128, 127]到[0, 255]的映射。如下所示:

+----------------------------+
| 255     -1       11111111  |
| 254     -2       11111110  |
| 246     -10      11110110  |
| 156     -100     10011100  |
| 129     -127     10000001  |
| 128     -128     10000000  |
| 127      127     01111111  |
| 100      100     01100100  |
| 10       10      00001010  |
| 2        2       00000010  |
| 1        1       00000001  |
| 0        0       00000000  |
+----------------------------+

这篇关于原码反码补码移码的目的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/519502

相关文章

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区

图形API学习工程(0):工程目的环境配置

工程目的 我想要不借助引擎,而直接使用底层图形API(如DirectX和OpenGL等)来生成图像。 我认为这将有利于图形学算法与渲染框架相关的学习,因为: 游戏引擎往往对渲染进行了豪华的封装,而不利于看到图形学算法本质。UE4虽然开放了源代码,但是想要完全掌握渲染方面的代码也需要较高成本。 另外,我想对不止一个主流API进行封装,而是多个图形API进行封装,包括: OpenGLD3D1

原码、反码、补码新解

世界上有10中人,一种懂二进制,一种不懂二进制。我们习惯了十进制计数,乍看到二进制,有点别扭,认识后慢慢发现它的神奇:有点一生二,二生万物的意思。十进制和二进制的部分对应关系如下: 小范围的十进制运算,我们操练起来麻麻溜溜的,二进制的运算相信你也不差,然,碰到十进制转二进制的运算就有点蒙圈了。 计算机 CPU 的运算器只实现了加法器,没有实现减法器。但,我们可以通过加上一个负数来实现减法运

公司数字化转型的目的是什么?

不同行业公司,其数字化转型的目的也不一样。下面我列举几个行业,给大家讲讲其数字化转型的真正目的。 制造数字化转型 制造业来说,数字化转型的本质是通过新一代信息技术与制造技术的融合,实现以数据为核心的资源要素变革、以网络化为牵引的生产方式重构、以扁平化为方向的企业形态转型、以平台赋能为导向的业务模式创新;构建全感知、全联接、全场景、全智能的数字工厂,优化产品的研发生产和营销流程,对传统管

读软件设计的要素02概念的目的

1. 要素 1.1. 概念的定义包括名称、目的、状态、操作和操作原则 1.2. 操作原则(operational principle) 1.2.1. 操作原则用于展示如何通过操作实现目的,这是理解概念的关键 1.2.2. 展示如何通过操作的组合实现概念的目的,包含一个或多个典型的使用场景 1.2.3. 操作原则并没有增加任何信息,因为你完全可以从操作规范中推理出任何使用场景 1

redis缓存的目的、场景、实现、一致性问题

文章目录 1、加缓存的目的(作用):2、加缓存的场景:读多写少3、加不加缓存的标准:4、缓存的实现:5、缓存的实现方案:6、缓存的粒度问题7、缓存的一致性问题 专辑详情和声音详情属于并发量较高的数据,如果每次访问都实时到数据库获取数据,数据库的访问压力太大。而这些信息一般更新的频率比较低,短时间内不会发生改变。因此,我们可以考虑在前台系统中,增加一层缓存,把这些数据缓存起来,请求到来

C语言操作符详解1(含进制转换,原反补码)

文章目录 一、操作符的分类二、二进制和进制转换1.二进制与十进制的相互转换2,二进制与八进制的相互转换3.二进制与十六进制的相互转换 三、原码、反码和补码四、移位操作符1.左移操作符(1)左移操作符移位方法(2)左移操作符规律总结 2.右移操作符(1)逻辑右移移位方法(2)逻辑右移规律总结(3)算术右移移位方法(4)算术移位规律总结 五、位操作符:&、|、^、~1.按位与操作符&2.按位或

数据库编程主函数前的代码-------仅记录目的

#include <tchar.h>#include <windows.h>#include <strsafe.h>#define COM_NO_WINDOWS_H //如果已经包含了Windows.h或不使用其他Windows库函数时#define DBINITCONSTANTS#define INITGUID#define OLEDBVER 0x0260 //为了IComma

招商会的目的和意义!该如何策划活动方案!

招商会作为一种高效的企业发展活动,不仅能快速招商,还能吸引潜在的合作伙伴,增加企业的曝光机会,从而推动公司的发展以及市场竞争力提升。 作为一名从事招商行业5年的创业者,我来分享下,如何策划招商活动方案! 一、定主题 明确此次招商会的目的。主题一定要与品牌形象和市场定位相关联,同时考虑目标客户的需求点在哪里! 比如公司产品是领先于同行,主题就可以围绕“引领行业”等。 二、活动流程和时间安排

【软考】——原码、反码、补码、移码

在计算机中,数据编码方式可以有多种,最为常见的有原码、反码、补码、移码。在进行原码,反码,补码,移码之间的转换的时候首先要将他们转换为二进制,在下面的讲解中以17为例来进行讲解。 将17转换为八位数的二进制为00010001。 【原码】      在原码中,将最高位用作符号位(0表示正数,1表示负数),其余各位代表数值本身的绝对值的表示形式,正数的原码是本身,负数的原码只