当前位置:网站首页>原码、补码、反码
原码、补码、反码
2022-08-02 14:03:00 【君知燕云归】
前言
原码、反码、补码的预备知识是进制转换,有需要的请参考:数据的表示方法和转换(二进制、八进制、十进制、十六进制)
一、真值与机器数


二、原码
1.原码的特点
***非常接近真值。**当运算结果不超出机器能表示的范围时,运算结
果仍为原码表示。
* 符号位不能参与运算。
• 当两数相加时,先要判断两数的符号,如果是同号,则相加;如果是异号,
则相减。
• 当两数相减时,先要比较两数绝对值大小,再用大绝对值减小绝对值,最后
确定运算结果正负号。
* 数值零表示结果不唯一。(有+0和-0之分)
2.原码表示法
机器数的最高位为符号位,0表示正数,1表示负数,数值跟随其后,并以绝对值形式给出。
[X]原=符号位+|X|
数的原码与真值之间的关系比较简单,其算术运算规则与十进制运算规则类似,当运算结果不超出机器能表示的范围时,运算结果仍以原码表示。它最大的缺点是在机器中进行加减法运算时比较复杂。例如,当两数相加时,要先判别符号,同号相加,异号相减。而进行减法运算又要先比较两数绝对值的大小,再用大绝对值减去小绝对值,最后还要确定运算结果的正负号。
原码最大的问题就在于一个数加上他的相反数不等于零:
正数原码之间的加法通常是不会出错的,因为它就是一个很简单的二进制加法。
而正数与负数相加,或负数与负数相加,就要引起不正确的结果,这都是符号位引起的。0分为+0和-0也是因它而起。
所以原码,虽然直观易懂,易于正值转换。但用来实现加减法的话,运算规则总归是太复杂。
三、补码(※)

1.补码的特点
补码的特点
* 用补码表示的两数进行加法运算,其结果仍为补码。
* 符号位与数值位一样参与运算。
* 数值“零”的补码表示形式是唯一的。
* [X + Y]补 = [X]补 + [Y]补
2.补码表示法
机器数的最高位为符号位,0表示正数,1表示负数,数值跟随其后,并以绝对值形式给出。
正数和零的补码是其本身,负数的补码按照各位取反末位加1的方式得到。
例题:
这里给出真值转补码的方法:首先X值为负,确定符号位为1(负),即原码为1,1100011,我们把后七位按照各位取反末位加1的方式得到补码,原理解释如下:根据上方给出的补码换算方式我们知可以用10000000+(-1100011)=1111111+1-1100011=10011101,即补码为1,0011101。其实还有更方便我们使用的规律存在,我在这里简述并举例。
规律为:自低位开始转换,从低位向高位,在遇到第一个1之前,保持各位的0不变,第一个1也不变,以后的各位按位取反,最后保持符号位不变,经历一遍后,即可得到补码。
例子:[X]原=1,1101010则从低位向高位,末尾的10不变,前面的各位按位取反,得到[X]补=1,0010110即为所求。
注意:符号位不参与补码的取反法则,0表示正数,1表示负数。
3.门电路符号

实现加法运算的逻辑示例:


四、反码
机器码的最高位为符号,0表示正数,1表示负数。
1.反码的特点
反码的特点
* 在最高位有进位时,要在最低位+1
* 反码零有两种表示形式
2.反码的表示

快捷转换方法:符号位保持不变,正数的数值部分不变,负数的数值部分按位取反。(与补码的区别是末位不用加一)
反码的正+正与正+负结果不会出错,而负加负会出现结果有误的情况。我们只需要加实现两个负数加法时,将两个负数反码包括符号位全部按位取反相加,然后再给他的**符号位强行置‘1’**就可以了。

五、强化练习

【解析】冯·诺依曼结构计算机中数据采用二进制编码表示的原因有:①技术实现简单,即制造两个稳态的物理器件较容易;②适合逻辑运算,便于用逻辑门电路实现算术运算;③简化运算规则,提高运算速度。因此Ⅰ、Ⅱ和Ⅲ都是其采用二进制的原因。
【解析】我们要抓住关键词:二进制补码,最小整数。数值的绝对值补码越大其原码越小,二者呈相反的关系,当考虑负数时,数值的绝对值越大,真实表示的数值越小,因此保证符号位为1的情况下,我们使补码取得最小值时表示的整数最小。由此可得该补码为:1,0000011,换算回原码为:1,1111101=-(64+32+16+8+4+1)=-125;
【解析】若X,Y,Z为无符号整数,X,Y,Z机器数的各位都用来表示数值,直接按照十六进制大小确定数的大小关系,显然FFFDH>FFDFH>7FFCH,故X>Y>Z,得A、B选项不正确。若X,Y,Z为有符号整数,用补码表示,X,Y,Z机器数的第一位表示符号,剩余各位用来表示数值,可以通过移码来判断数的大小关系。将补码的符号位取反可得移码,于是有X,Y,Z的移码:7FFDH,7FDFH,FFFCH,显然7FDFH<7FFDH(X,Y,Z机器数的第一位表示符号后,z为正数,x,y为负数,且x的数值真值比y大,则看绝对值数值补码x比y小,又x,y为负数故x大于y,答案为若x,y和z为带符号整数,则y<x<z,选D)
几种码制的总结
这里推荐一篇写的不错的博文:原码,反码,补码的深入理解与原理
正数:原码、补码、反码的处理原则一致,即符号位为0,其余数不变。
负数:原码、补码、反码的符号位均为1,但其规则各不相同。
负数原码:数值位不变,原码最大的问题就在于一个数加上他的相反数不等于零。
负数补码:数值各位按位取反,末位加一。
负数反码:数值各位按位取反, 在最高位有进位时,要在最低位+1。
三种码中只有补码0是唯一的,原码和反码的0具有不唯一性。
三种机器数的比较
* 正数都等于真值本身,负数各不相同
* 最高位都表示符号位,补码和反码的符号位可以和数值位一起参与运
算,但原码的符号位必须分开进行处理
* 对于真值0,原码和反码各有两种不同的表示形式,而补码只有唯一
的一种表示形式
* 原码、反码表示的正负数范围是对称的,但补码负数能够表示一个最
负的数(绝对值最大的负数),其值等于-2n或-1。
边栏推荐
- run yolov5
- C语言sizeof和strlen的区别
- static关键字3种作用,简单粗暴对比,好理解
- Flask-RESTful request response and SQLAlchemy foundation
- drf source code analysis and global catch exception
- MobileNet ShuffleNet & yolov5替换backbone
- C语言一级指针(补)
- yolov5,yolov4,yolov3乱七八糟的
- Flask framework
- [ROS] Introduction to common tools in ROS (to be continued)
猜你喜欢

第十单元 前后连调

【c】小游戏---五子棋之井字棋雏形

C语言一维数组练习——将m个元素移动到数组尾部

C语言日记 3 常量
![[ROS] Introduction to common tools in ROS (to be continued)](/img/ea/e390106f750bf697e62a3a296014d2.png)
[ROS] Introduction to common tools in ROS (to be continued)

redis delay queue

yolov5,yolov4,yolov3 mess

Deep learning framework pytorch rapid development and actual combat chapter3

Creating seven NiuYun Flask project complete and let cloud
![[ROS]roscd和cd的区别](/img/a8/a1347568170821e8f186091b93e52a.png)
[ROS]roscd和cd的区别
随机推荐
verilog学习|《Verilog数字系统设计教程》夏宇闻 第三版思考题答案(第十章)
verilog学习|《Verilog数字系统设计教程》夏宇闻 第三版思考题答案(第十一章)
Implementation of redis distributed lock and watchdog
MobileNet ShuffleNet & yolov5替换backbone
C语言——断言assert的使用
A little thought about password encryption
Basic operations of 8583 sequential stack
使用云GPU+pycharm训练模型实现后台跑程序、自动保存训练结果、服务器自动关机
Flask framework in-depth two
Paddle window10 environment using conda installation
Unit 8 Middleware
[ROS] (02) Create & compile ROS package Package
8580 合并链表
第三单元 视图层
[ROS] (05) ROS Communication - Node, Nodes & Master
8576 顺序线性表的基本操作
8581 线性链表逆置
线性代数期末复习存档
[ROS] Introduction to common tools in ROS (to be continued)
深度学习框架pytorch快速开发与实战chapter4

