当前位置:网站首页>原码、补码、反码
原码、补码、反码
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。
边栏推荐
猜你喜欢
随机推荐
安装使用——百家CMS微商城说明文档(2)
Unit 8 Middleware
yolov5,yolov4,yolov3乱七八糟的
drf view component
Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin [id ‘c
STM32(F407)—— 堆栈
[ROS](03)CMakeLists.txt详解
云GPU(恒源云)训练的具体操作流程
第十一单元 序列化器
MobileNet ShuffleNet & yolov5替换backbone
C语言日记 5、7setprecision()问题
8576 顺序线性表的基本操作
[ROS] (02) Create & compile ROS package Package
8576 Basic operations of sequential linear tables
The IDEA of packaged jar package
How does Apache, the world's largest open source foundation, work?
C语言sizeof和strlen的区别
重新学习编程day1 【初始c语言】【c语言编写出计算两个数之和的代码】
C语言一维数组练习——将一个字符串中的某个字符替换成其它字符
Flask framework in-depth two









![[ROS]roscd和cd的区别](/img/a8/a1347568170821e8f186091b93e52a.png)

