当前位置: 首页 > ds >正文

【计算机组成原理】原码、补码和移码

       

目录

原码

表示方法

表示范围与特殊值

补码

为什么引入补码

表示方法

表示范围与特殊值

移码

表示方法

表示范围与特殊值

三码辨析:各自的优点、缺点与适用场景

各种码之间的转换与快速变换技巧

原码补码互转

补码移码互转

原码移码互转

A的补码转为﹣A的补码


 在计算机中,真值是数值本身的真实含义,而机器数是用于计算机内部存储和运算的编码方式。由于计算机只能处理0和1,表示带符号数就变得复杂。为此,引入了原码(直接用最高位表示正负)、补码(将减法转化为加法、便于硬件实现统一运算)、移码(用于浮点数表示,方便比较大小)。这些编码方式是为了让计算机更高效、统一地处理正负数、整数和浮点数。

原码

表示方法

        原码用机器数的最高位表示数的符号,后面的位数表示数的绝对值。

        例如,A=+1110,B=-1110,字长为8位,则其原码表示为A=0,0001110,B=1,0001110,其中最高位是符号位。

表示范围与特殊值

        如果用一个圆表示8位原码能够表示的所有值,其结构示意如下:

        上面的图有几个特点:

        1、能够表示的值最小为11111111,为-127,2^{7}-1-(2^{7}-1);最大值为01111111,为+127,即2^{7}-1

         2、总共有两个0,分为+0与-0.

        3、在圆的左半边,随着二进制数增大,原码的真值在减小;而在圆的右半边,随着二进制数增大,原码的真值在增大。也就是说原码无法构成一个时钟一样的环结构,这也是后面需要引入补码的原因。

        若机器位长为n,原码的表示范围为[-(2^{n-1}-1),2^{n-1}-1]

        原码特殊值需要记忆的是:

        +0=00000000        -0=10000000        MAX=127=01111111        MIN=-127=11111111

补码

为什么引入补码

        首先我们需要知道一个前置条件,在计算机的运算器中,一般来说硬件越简单越好,这样可以节省成本并且提高效率。比如说计算机需要进行加减乘除运算,但是只用一个硬件加法器和用多个硬件加法器减法器乘法器除法器,显然前者成本更低,占的空间更小。所以假如我们可以通过某种方式,使得减法能够用加法器运算,那就很好。

        那么如何实现这种效果呢?这里需要引入模运算的概念。模运算中,一个数与它除以“模”后得到的余数是等价的。如:

        若A、B、M满足A=B+K×M(K 为整数),记为A=B(modM),即A、B各除M以后的余数相同。

        在模运算中,(A)-(B)=(A)+M-(B)(Mod M),又M-(B)=(-B),故可以把(A)-(B)变为A+(-B)。
        补码就是为了表达“负数”在模意义下的等价形式。例如,在8位二进制中,模是 2^8=256,一个负数(-B)的补码真值就应该是 256−B,这样就可以用加法实现减法。在机器数实际操作中,若B的补码要变为-B的补码是非常好实现的(只需要把所有位按位取反再+1,这是后话),所以只需要对原码进行一些改动,使其符合模运算的规则,就能够实现减法变加法的操作。

        而模运算实际上和环结构是等价的(转完一圈后归零),所以只需要思考怎么把机器数和真值搞成一个环即可。

        同样还是一个圆结构,观察如何更改数字能够让其变为一个环,即随着二进制数沿着顺时针或者逆时针方向增大,机器码也能够与其一同正向变换。且看下图:

        上面的圆对原码表示方法做了一些改动,使得这种机器码的表达方式(补码)能够使得其像一个时钟一样成为一个环结构。其特点如下:

        1、当补码的真值增加到最大,机器码再+1变为10000000,使其对应最小值-128,而非原码的-0,实现首尾相接。

        2、当补码在左半边时,机器码每+1(为了与右半边协同,顺时针方向行动视为+1),真值也需要+1。于是规定:当补码为负数时,其值为原码的除符号位所有值按位取反后再+1。这样的变换规则也符合模运算的数学定义。

        3、当补码的机器码增加到最大,即11111111,此时按照2的规则,其真值为-1。此时机器码再+1,则变为100000000。由于机器码只有八位,所以实际上机器码为00000000,即为0。所以此时机器码+1,真值也+1,符合环结构特征。

表示方法

        综上,如果对原码作以下改动使其变为补码,则其结构符合环结构特征:

        1、当符号为正,补码等于原码。

        2、当符号为负,补码等于原码除符号位外按位取反再+1。

        3、规定原码的10000000(-0)在补码中表示为-128,即2^{-7}

表示范围与特殊值

        若字长为n,则补码的表示范围为[-2^{n-1},2^{n-1}-1],比原码多表示一个数。

        补码需要记忆的特殊值如下:

  +0=-0=00000000     -1=11111111     -128=10000000(占了原码中-0的坑)    127=01111111

移码

表示方法

       移码就是在真值X上加上一个常数(偏置值),通常这个常数取2^{n-1}(字长为n),相当于X在数轴上向正 方向偏移了若干单位,这就是“移码”一词的由来。移码的定义如下:

x移码=2^(n-1)+x

        移码、原码与补码在机器数数轴上的差异如下图所示:

        

        通过上图可以看到,移码越大真值越大,而原码与真值的变换关系在轴上不明确。事实上,移码与补码类似有相应的环结构特点(补码因为处于11111111时+1时最高位溢出所以和真值的对应关系没有移码这么清晰),他们之间的转换仅有符号位的差异,补码的符号位取反即为移码。

表示范围与特殊值

        移码的表示范围和补码一样,为[-2^{n-1},2^{n-1}-1]

        移码需要记忆的特殊值如下:

        +0=-0=10000000        -128=00000000        127=11111111

三码辨析:各自的优点、缺点与适用场景

编码方式优点缺点适用场景
原码- 表示直观,最高位为符号位,数值部分为绝对值
- 易于理解
- 存在“+0”和“-0”两个表示
- 加减法运算复杂,需要区分符号
- 数据显示
- 人工理解与调试
- 教学引导
补码- 只有一个0(无正负零)
- 可将减法转化为加法,用统一的加法器实现加减运算
- 运算效率高,硬件实现简单
- 对人类不直观,不容易直接看出其代表的真值
- 表示范围略不对称(负数多一个)
- 计算机内部通用格式
- 算术运算(加减乘)
- 整数寄存器和ALU操作
移码- 所有数值都是非负数(适合排序、比较)
- 符号位变为参与数值计算的一部分,便于与无符号数统一处理
- 加减法等运算不方便
- 需要额外偏移处理
- 浮点数阶码部分(IEEE 754标准)
- 符号排序与比较操作

各种码之间的转换与快速变换技巧

原码补码互转

        注意正数原码等于补码,负数转换方法如下:

        1、普通方法:除了符号位其他位按位取反后再+1。

        2、快速方法:从右往左数找到第一个1,1的左边按位取反,符号位和1的右边不变。

        原理:从右往左数第一个1的右边全是0,按照普通方法的第一步处理后,除了符号位的其他位都应该从0变1、1变0,所以第一个1变0,第一个1右边的所有0变1,,再经过+1操作后,右边位数统统进位1,加到第一个1所变成的0上不再进位。

补码移码互转

        补码与移码只差一个符号位,所以把符号位取反即可。

原码移码互转

        建议直接把原码变为补码后再转换为移码。

A的补码转为﹣A的补码

        1、普通方法:把A的补码转换为A的原码,再把A的原码变为-A的原码,再把-A的原码转为-A的补码。

        2、快速方法:把从右往左数第一个1的左侧所有位数取反。

http://www.xdnf.cn/news/15982.html

相关文章:

  • ZooKeeper学习专栏(一):分布式协调的核心基石
  • 阶段1--Linux中的计划任务
  • 大模型词表设计与作用解析
  • 开源安全大模型Foundation-Sec 8B的安全实践
  • Baumer工业相机堡盟工业相机如何通过YoloV8的深度学习模型实现螺母螺丝的分类检测(C#代码,UI界面版)
  • 【开源项目】基于RuoYi-Vue-Plus的开源进销存管理系统
  • 软件工程:需求分析
  • XSS内容总结
  • 建筑墙壁损伤缺陷分割数据集labelme格式7820张20类别
  • 从零到精通:用DataBinding解锁MVVM的开发魔法
  • 优先算法——专题十:哈希表
  • JAVA高级第六章 输入和输出处理(一)
  • 人工智能与心理史学:从阿西莫夫的科幻预言到可计算社会模型>
  • 车载通信架构 --- DoIP协议通信
  • Java多线程基础详解:从实现到线程安全
  • CS231n-2017 Lecture2图像分类笔记
  • Map集合
  • C++入门--lesson4
  • 嵌入式学习-PyTorch(9)-day25
  • HTTPHTTPSTLSDNSRSA
  • Python技术题2
  • 工程图矢量化 笔记 | potrace ezdxf svgpathtools | png转svg保存dxf用matplotlib画出来
  • 如何构建未来的人-AI-环境智能教育生态系统
  • 线性回归问题
  • xss的利用
  • 《YOLOv13魔术师专栏》全景指南:从理论到工业级实战
  • ICT测试原理之--什么是假短
  • JavaSE-接口
  • Android14 SystemUI 启动流程(2)
  • 笔试大题20分值(用两个栈实现队列)