原码,反码,补码,阶码,移码

article/2025/8/30 10:16:44

本文转载自本站大佬“不去上课”,原文链接icon-default.png?t=M4ADhttps://blog.csdn.net/ruidianbaihuo/article/details/87875178

原码,反码,补码,阶码,移码是什么?有什么区别(讨论机器数的表示)
本文内容参考自王达老师的《深入理解计算机网络》一书<中国水利水电出版社>

一、机器数解释:
机器数是计算机中参与运算且带有(+)、(-)属性的二进制数
–引用自王达老师的《深入理解计算机网络》

1、计算机中的数如何表示符号?(计算机的数也是存在正负之分的,那么如何区分它们的正负呢?)
我之前的博文介绍二进制的时候,是没有考虑二进制带符号的情况,但是,数制之间的转换是不包括符号位的,即转换的时候,符号位是保持不变的。现在,我专门来介绍带符号的二进制数,也就是机器数的各种表示(原码,反码,补码–正是因为二进制带上了符号,所以产生了这些叫法)
⑴、机器数 –机器数是有符号位的二进制数,规定用它的最高位表示符号位,0表示正数,1表示负数,比如+1101:01101,-1101:11101,一般来说,没有符号位的二进制数称为"无符号数",是不参与各种运算的,比如信息编码等。
这里需要提示一下:一旦二进制数有符号了,那么在数制之间进行转换的时候,千万记得不要把二进制最高位的数值表示一起转换了,因为那是符号位。也不要对0 1101 0110这种开头为0的二进制数感到奇怪,这个最高位的0不是二进制的数值有效位,仅表示符号(+),说明了这是一个正数。
下面,我们来谈几个必须要了解的概念:
以下内容引用自王达老师《深入理解计算机网络》一书
真值:因为机器数是带有符号位的了,那么这个机器数的实际值是需要将符号位去除的,剩余的部分才是这个机器数的实际值,这个剩余的部分所表示的值就是机器数的"真值"。
字长:字长可以简单理解为用来表示一个机器数所用的二进制位数,就是我们常说的8位,16位,32位,64位(硬件CPU能处理的最小字长是一个字节,一个字节就是8位二进制,所以也会说1字节,2字节,3字节,4字节)。
如果确定了字长,那么所有的机器数都是用固定的字长来表示,无论机器数的大小。
字长不同,同一个机器数的表示就不同,比如字长为8位,+5的表示为:00000101,-5的表示为10000101,16位字长,+5的表示为0000 0000 0000 0101,-5的表示为1000 000 000 0101。一个机器数是必须要单独占用一个字长的,否则计算机无法知道一个存储单元中的机器数到底是多少。
+0和-0: 虽然说,我们在纸面上看+0和-0是一样的,但是因为机器数的符号位正值用0表示,负值用1表示,所以在计算机中+0和-0的表示是不同的。如果是32位字长,+0是0000 0000 0000 0000 0000 0000 0000 0000,-0是1000 0000 0000 0000 0000 0000 0000 0000。所以,在二进制的机器数中,0有两个(+0和-0),且他们的表示形式不一样。
必要的计算机知识:CPU有16位(目前比较少见了),32位,64位的,内存也有16位(目前比较少见了),32位,64位的,这里的16位,32位,64位对应的就对应了相应的计算机系统中的字长,计算机内存中数据的存储是以单位长度(字长)进行连续存储的,一个机器数只能在一个存储单元中进行存储(一个存储单元的长度就是一个字长),反过来,一个存储单元只能存储一个机器数,CPU也是以存储单元(一个字长)为单位从内存中读取并处理数据的,所以,字长是计算机一次可处理的机器数的码位长度,是计算机进行数据存数和数据处理的运算单位。我们通常所指的32位处理器就是指该处理器的字长为32位(一次能处理32位二进制位),64位处理器也是同理。显然,字长越长,CPU处理数据的能力就越强(因为字长越长,能表示的数值越大,同时能包涵的数据内容也就越多)。
目前的计算机大多是64位的,我们知道,8位是一个字节,也就是说,现在计算机中的一个存储单元是8个字节,那么,64位的CPU可以一次性从内存中读取并处理8个字节。

1、机器数的编码形式?
为了使机器数的运算方法适用于所有机器数("+"、"-"等运算),同时保证运算不会出现二义性,在机器数的运算方法演变过程中出现了三种不同的机器数编码方式:原码、反码、补码。
⑴、原码
原码是一个数的带符号位的二进制表示,但是原码与字长有关,比如+3的原码是011(不考虑字长的情况,0是表示正数,11是3的二进制表示),如果字长为8位,那么+3的原码就是0000 0011,需要用0补齐8位,同理,-3的原码是1000 0011(只需要将+3原码的符号位由0改成1),如果是浮点数的二进制,则需要在小数点右边补0,如(0.11010)B,它的8位字长原码为(0.1101000)B,在右边末尾补0直至长度为8位。
虽然说原码很直观,设计简单,容易理解(10进制直接转换过来的二进制表示,其实就是原码),但是在某些方面,原码还是有不足之处,总结起来就是以下两点:
1、原码的加减运算规则很复杂,它的符号位要进行单独的处理,还可能出错,采用原码直接进行机器数运算的时候,两数同为正数或者是负数时,运算是没什么问题,如果一个是正数,一个是负数,那么两数相加减就会出问题:
0 0000001+1 0000001 = 1 0000010(-2);
以上例子是将十进制的1+(-1)转换成二进制进行运算,结果应该是等于0,但是用原码运算,得出的结果是-2,显然不正确!(二进制的加减运算规则是0+0=0,0-0=0,1+0=0,1-0=0,1+1=10,1-1=0)。
2、原码中的0有两种表示(+0和-0),存在二义性!
所以从以上两点来看,直接采用原码进行机器数运算是不合适的!
⑵、补码
因为原码在机器数运算时有很明显的不足,经过坚持不懈的努力,设计者终于找到了一种能解决原码所有不足的另一种新的编码方式–补码!那么补码又是一种什么编码呢(补码不可能采用与原码一样的编码方式,因为那将会导致与原码一样的不足)?
补码的编码规则其实是建立在原码的基础上的,内容如下:
1、正数的补码和原码完全一样,负数的补码是通过将除符号位外的其他各位取反,再将结果+1得到的(计算负数补码的时候,一定要隔离它的符号位,保持不变!)。
比如一个原码为0 0000101的机器数,因为它的最高位是0,所以是个正数,它的补码是0 0000101(与原码完全一样)。
另外一个原码为1 0000101的机器数,因为它的最高位是1,所以是个负数,它的补码是,先把最高位1隔离开,剩下的部分为0000101,对这一部分取反(取反的意思就是1变0,0变1)得到的j结果为1111010,再将1放回最高位,所以最后的结果是1 1111010,。
补码的最大优点是方便了机器数的运算,补码运算的时候,符号位是不需要单独处理的,可以将符号位一起带入运算。同时,它也继承了部分原码的优点。
以字长为8位为例,将之前的1+(-1)转换成二进制补码运算:
1的补码为:0 0000001
-1的补码为:1 1111111
那么0 0000001+1 1111111 =100000000,得到的结果100000000明显是9位了,但是这里的字长只有8位,所以将舍弃最高位1,得到的结果就是00000000,转换成十进制就是0,正确!这里需要特别注意,当补码计算得到的结果超出了字长,那么需要舍弃最高位,取结果的字长长度,才能保证正确!
同时我们还发现:
以字长为8位为例
+0的补码是:0000 0000
-0的补码是1 0000 0000这里也同样是超出了8位字长,舍弃最高位后-0的补码也是00000000,所以,补码中没有+0和-0这种二义性!
如果给你一个补码,想得到原码,那么你只需要通过原码转换成补码的逆过程就可以了。
⑶、反码
通过以上的介绍,我们可以得知,补码是二进制运算中的最佳选择,因为它可以将符号位和真值一起进行运算,完美解决了异号二进制数之间的加减运算问题,那么,反码是怎么出现的呢?
实际上,反码只是原码向补码表示形式转换过程中的一个过渡形式,不是可直接用于机器数运算的一种编码方式,当初能发现反码这种形式,是因为很多时候一件事情从一个方向解决不了,往往会考虑另一个角度去解决,即原码解决不了运算的问题,那么所有的二进制取反是否可行,就这样,偶然发现了反码这种表现形式。
其实,与补码一样,反码也是专门针对负数的,因为正数的反码也是和原码完全一致,而对负数,则需将除符号位外的其他位取反,即由原来的0变1,由1变0。
因为反码只是单纯地对每一位取反,所以它也存在某些不足:
1、1+(-1)采取反码计算的结果与原码一样是不正确的。
2、2+(-3)采取反码计算的结果却是正确的。
3、123+(-121)采取反码计算的结果与原码一样是不正确的。
反码中也有+0和-0之分。存在二义性。因为从原码的角度来看,+0和-0的反码不一样。
原码、补码、反码总结:正数的原码,反码,补码都是一样的,而负数的原码,补码,反码是不一样的,需要分别转换得出。负数的补码是除符号位的其他位取反再+1得到,负数的反码是除符号位,其他位取反得到。
⑷、阶码
阶码是机器数里浮点数中的称谓,阶码指的就是浮点数中的指数,它表示了浮点数中这个小数点的具体位置(计算机中不是直接存储二进制浮点数的字面值,而是通过存储浮点数的符号位,指数[也就是阶码],尾数值来间接存储一个浮点数的,因此会导致浮点数的小数点位置不确定,在我的其他博文中也有有关这个问题的详细解释)。
下面来举个例子:
对于任意一个二进制数N,均可用N = S * 2P表示,其中S就是尾数,P就是指数,也叫阶码,2为指数基数,也叫阶码的底数,P,S都用二进制表示,S表示N的全部有效数字,所以在这里,P能指明小数点的位置,当阶码固定,表示的数就是定点数,当阶码可变,表示的数位浮点数,这就是阶码的主要应用。
其实在我看来,阶码就是一个称呼而已,没必要深究,只是如果你看到了阶码这两个字,你能知道,它指的就是指数就行了。
⑸、移码
移码有两个很重要的作用:
1、方便机器数比较大小。
2、用于浮点数中"阶码"的修正(实际上就是为了将浮点数的表现形式都规范化)。
以上内容的实现都是通过在原来编码的基础上加上一个常数来实现的(实现方式不一样),下面具体解释一下。
在机器数比较方面的应用:
机器数的运算都是采用补码的方式,因为采用补码不必考虑符号位,符号位可以与真值位一起带入运算,很方便,但是,如果你直接通过补码来比较机器数的大小,不是很直观。
比如十进制+31,对应的二进制表示是+11111,也就是011111,它的补码为011111,十进制数-31,对应的二进制表示为-11111,它的补码为:100001,看上去好像100001》011111,实际上正好相反,如果我们对每个机器数的原码真值部分(符号位需要转换成"+“或者是”-")加上一个2n,(n代表原来二进制编码的真值部分位数,即去掉符号位剩余的位数,在这里是5),所以用31的真值部分+11111+25 = 111111,而-31就是-11111+25=000001,然后将得到的结果再比较大小,那么两个数的大小就一目了然了。
移码的计算公式:X移 = X + 2n,因为阶码通常是原码形式,由此可以得出移码与补码的关系,移码实际上就是补码的符号位取反,其他位不变。这样一来,在移码中,正数的符号位为1,负数的符号位为0,与前面的原码,补码,反码中的符号位规定相反。
在浮点数中的应用:
阶码就是指数,但是指数也是有正负的,这样一来,就会导致一个机器数存储需要有两个符号位:一个是机器数本身的符号位,一个是阶码的符号位。
为了节省空间,省去阶码的符号位,就采用了对每一个阶码都加上一个相同的,比较大的正数(偏移值),这样就能保证最后的结果都是正整数,同时在运算的时候,系统会自动对指数部分减去这个正数,以此来保证计算结果正确,以上过程中,“阶码"就变成了偏移了的"阶码”,就是移码了。有的资料里面也会称为"增码"。
这个正数是根据存储器的字长来规定的,具体的可以自行了解一下。
在此,再次感谢王达老师的《深入理解计算机网络》一书对本文的启发!
 

 


http://chatgpt.dhexx.cn/article/GO9BOsRE.shtml

相关文章

原码、反码、补码之间的转换和简单运算

一、正整数的原码、反码、补码完全一样&#xff0c;即符号位固定为0&#xff0c;数值位相同 二、负整数的符号位固定为1&#xff0c;由原码变为补码时&#xff0c;规则如下&#xff1a; 1、原码符号位1不变&#xff0c;整数的每一位二进制数位求反&#xff0c;得到反码 2、反码…

原码,反码,补码的概念

计算机里都是以补码的形式存储数据&#xff0c;电脑只能识别二进制的0和1&#xff0c; 一个字节&#xff08;8位&#xff09;为例 原码 &#xff1a;最高位符号位&#xff0c;0代表正数&#xff0c;1代表负数&#xff0c;非符号位为该数字绝对值的二进制。 反码&#xff1a;正…

C语言——原码, 反码, 补码 详解

目录 一. 机器数和真值 1、机器数 2、真值 二. 原码, 反码, 补码的基础概念和计算方法. 1. 原码 2. 反码 3. 补码 三. 为何要使用原码, 反码和补码 四 原码, 反码, 补码 再深入 同余的概念 负数取模 开始证明 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先…

原码、反码、补码、移码的概念及转换

目录 前言 1.原码 2.反码 3.补码 4.移码 前言 学习完数的小数点表示&#xff0c;下一个需要解决的问题就是数的机器码表示问题。 在计算机中对数据进行运算操作时&#xff0c;符号位应该如何表示&#xff1f;是否也同数值位一道参加运算操作呢&#xff1f;如果参加&…

mt7620芯片处理器核心资料

MT7620产品系统整合了2T2R 802.11n Wi-Fi 收发器、580MHz MIPS 24KEc™ 中央处理器 (CPU)、5 端口高速以太网络端口物理层 (Ethernet PHY)、HNAT、存储器加速器、USB2.0 主机/设备&#xff0c;以及多种慢速输入输出 (U客论坛)。MT7620A 支持 PCIe、RGMII&#xff0c;适用于 AC7…

mt7620参考设计原理图,mt7620芯片资料,mt7620处理器资料

mt7620参考设计原理图,芯片资料,处理器资料 核心资料 芯片处理器资料 设计注意事项 处理器大全 音频语音设计资料文档(U客论坛) MT7620产品系统整合了2T2R 802.11n Wi-Fi 收发器、580MHz MIPS 24KEc™ 中央处理器 (CPU)、5 端口高速以太网络端口物理层 (Ethernet PHY)、HNAT…

MT7682参考手册,MT7682芯片资料介绍

MT7682 Reference Manual 2.总线体系结构与内存映射 MediaTek MT7682采用32位多AHB矩阵&#xff0c;为物联网和可穿戴设备提供低功耗、快速、灵活的数据操作.表2.1-1显示了总线主机之间的互连(Cortex-M4&#xff0c;四个spi主站&#xff0c;spi从机&#xff0c;调试系统&#…

MT7628 openwrt学习(1)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、拿到板子之后干的事情二、openwrt编译文件下载tftp中的坑 最后是SSH和简单的编译 前言 主要是用来记录我的MT7628踩坑经历&#xff0c;所有东西都是开源的…

mt7621芯片更换ram

最近公司设备的内存占用率过高&#xff0c;经常性的导致设备挂掉&#xff0c;于是准备换一个ram。 解决方案&#xff1a; 在openwrt目录下&#xff0c;进入target/linux/ramips/dts目录&#xff0c;找到设备使用的CPU型号对应的dts文件&#xff0c;然后修改其中内容。将memory的…

MT7621处理器资料解析,MT7621数据表

MT7621处理器资料解析,MT7621数据表 MT7621 Wi-Fi 系统单芯片包含功能强大的 880 MHz MIPS 1004KEc™ 双核心中心处理器 (CPU)、5 端口 Gigabit 以太网络交换器,以及RGMII、PCIe、USB、SD-XC 等众多连接选项。这款全新系统单芯片亦随附我们经现场验证的硬件支持,涵盖网络地…

MT6261处理器参数介绍,MT6261芯片资料

MT6261处理器&#xff1a; MT6261是一种基于低功耗CMOS工艺的集成前沿电源管理单元、模拟基带和无线电电路的单片芯片。 MT6261是一种功能丰富、功能非常强大的用于高端GSM/GPRS能力的单芯片解决方案。基于32位ARM7EJ-S TM RISC处理器&#xff0c;MT6261的卓越处理能力TH高带…

MT8167处理器型号对比,MT8167芯片资料介绍

MT8167平台有两个版本&#xff0c;分别是MT8167A和MT8167B。两者之间最大的、唯一的区别在于MT8167A提供略高的处理和图形性能规格&#xff0c;最大的区别是支持60pps的1080p视频解码&#xff08;MT8167B的30fps以上&#xff09;和全高清支持&#xff08;19201200&#xff09; …

mt7682芯片处理器详细资料介绍

MTK MT7682S是基于一个高度集成的芯片组&#xff0c;包括一个微控制器单元(MCU)、一个低功耗的1x11n单波段Wi-Fi子系统和一个电源管理单元(PMU)。单片机是一个带有浮点单元的ARM Cortex-M4处理器&#xff0c;与1MB的闪存集成在一起。 Wi-Fi子系统包含802.11b/g/n无线电、基带和…

MT7621A的首板终于收到了

经过一个近一个月的生产加工&#xff0c;MT7621A的硬件终天收到了。 先上两个图&#xff1a; 正面 刚拿到电路板&#xff0c;测试电源时竞然发现1.1VD对地短路。&#xff08;一想这个可完了&#xff0c;刚做的电路板就短路&#xff0c;一定死定了&#xff09; 通过认真仔细的分…

MT7628 wifi模块,MTK路由器芯片介绍

MT7628处理器&#xff1a; MT7628nn/mt7628an 系列产品是新一代2T2R 802.11n Wi-Fi AP / 路由器 (系统单芯片)。 MT7628可提升射频效能表现、减低功耗&#xff0c;并将整体物料清单 (BOM) 成本优化&#xff0c;令它成为性价比最出众的 2x2 11n 解决方案。MT7628产品家族整合了…

MT7621路由器芯片/处理器参数介绍

MT7621路由器芯片包括一个880 MHz MIPS 1004Kc™CPU双核&#xff0c;一个5端口10/100/1000交换机/PHY和一个RGMII。嵌入式高性能cpu可以很容易地处理高级应用程序。如路由、安全和VoIP等。MT7621还包括支持多种应用程序的接口选择&#xff0c;例如用于访问外部存储的USB端口。 …

MT7621_基础篇(1) 芯片资料了解 一

项目开发需要使用MT7621&#xff0c;负责驱动移植&#xff0c;适配公司板卡。网上相关资料多为涉及openwrt的&#xff0c;不太符合我们裁剪要求&#xff0c;故记录此流程&#xff0c;进行深入学习研究。首先先对芯片资源做一个了解。后续计划包括uboot移植分析&#xff0c;kern…

MT7621_基础篇(2) 芯片资料了解 二

本篇依然为MT7621相关外设的介绍&#xff0c;pin和交换switch。&#xff08;无介绍的模块将在分析章节研究些许细节&#xff09; USB3主机控制器和PHY 手册中没有任何介绍&#xff0c;只有寄存器描述。详情见手册寄存器列表。 网络 PSE: 线速&#xff08;1000 Mbps&#xff0…

MT7621A路由器芯片参数/处理器资料(原理图/CPB)介绍

MT7621A支持高级别AP/路由器的要求&#xff0c;以及大量的接口以及巨大的最大RAM容量。 feature MT7621A CPU MIPS1004Kc (880 MHz) I-Cache, D-Cac…

无线路由器CPU浅析 MT7621A、 BCM47189 到底谁强?

转自&#xff1a;http://bbs.360.cn/thread-14459037-1-1.html 在第一讲中&#xff0c;已经粗略介绍过了目前路由芯片的四大厂&#xff1a;Broadcom&#xff08;博通&#xff09;、Qualcomm&#xff08;高通&#xff09;、MTK&#xff08;联发科&#xff09;、Realtek&#xf…