计算机组成原理----原码,反码与补码

目录

1.原码的出现

2.反码的出现

3.补码的出现

4.关于补码


1.原码的出现

我们通常使用"+","-"判断数字的正负,而在计算机中,则将二进制的首位当作标记符号,"0"表示正数,"1"表示负数,这样就解决了在计算机中表示数值正负的问题,唯一的缺点就是第1位被占作符号位。

    0 0000001 原+  0 0000010 原=  0 0000011 原

2.反码的出现

原码解决了数值的正负表示问题,但是没有解决加减法的问题,由于计算机只会进行加法运算,所以对于3-5,我们可以转换为3+(-5)=-2,将其转换为加法运算,若用原码进行计算:

     0 0000011 原+   1 0000101 原=   1 0001000 原

得到十进制:-8,结果错误,看来直接用原码进行加法是不行的,因为原码的符号位参与了运算。

所以反码出现了:

① 正数的反码是本身

② 负数的反码是符号位不变,其余位取反

3的原码为: 0 0000011

-5的原码为:1 0000101

-5的反码为:1 1111010

用反码,计算一下:3 + (-5) = -2

     0 0000011 反
+    1 1111010 反
=    1 1111101 反

1 1111101是反码,需要转换为原码,就是除了符号位以外都取反,得到1 0000010

十进制:-2,结果正确! 我们发现反码解决了原码进行加法时错误的问题,并且符号位也参与了运算。可以实现计算机的加减运算。

补充:

其实原码进行加减也没有问题,只要排除符号位的干扰即可,我们可以这样做:

对于两个不同符号的数,我们先要比较两个数的绝对值大小,然后用绝对值大的数减去绝对值效地数,然后为结果选择合适的符号位。

3.补码的出现

当我们遇到如下情况时:

正数+1的原码为:0 0000001

负数-1的原码为: 1 0000001

用反码,计算一下:1 + (-1) = 0

     0 0000001 反+   1 1111110 反=   1 1111111 反

得到结果:1 1111111,因为1 1111111的首位为1,表示为负数,反码需要转化为原码

把1 1111111除符号位取反得原码:1 0000000

得到十进制:-0,0本来是没有正负之分的,所以我们发现用反码计算,真值的部分是正确的,问题出现在符号位。所以出现了补码:

当我们对数值做如下变换:

① 正数的补码就是其本身

② 负数的补码就是本身取反再+1,也就是反码+1

再计算一下上面的问题:

正数+1的补码为:0 0000001

负数-1的补码为: 1 1111111

     0 0000001 补+   1 1111111 补=   0 0000000 补得 1 0 0000000 高位舍去

得到结果:0 0000000

结果的首位为0,表示为正数,不需要再取反,则原码就为:0 0000000

看到这里,我们可以总结一下了:

1.补码能够正确地进行加减法运算,所以计算机的加减运算都是通过补码实现的。

原码的特点:

1.原码加减运算比较复杂

2.原码有正零和负零两种表示方式,[+0]原=0 0000000 [-0]原=1 0000000

反码的特点:

1.正数的反码就是它本身,负数的反码就是符号位不变,其余位取反

2.对应原码,反码的0也有两种表示方式,[+0]反=0 0000000 [-0]反=1 1111111

对于8位二进制数(含符号位)而言,其原码和反码能表示的范围相同,都是-127~127

原码:1 111 1111 (-127)到 0 111 1111(+127)

反码:1 000 0000 (-127)到 0 000 0000(+127)

补码的特点这里只说一点,后面再补充:

补码的0只有一种表示形式,就是0 0000000,我们将反码+1得到补码:

[+0]补=0 0000000

[-0]补=1 0 0000000,超过二进制位数,舍去最高位,得到0 0000000

所以补码的"0"只有1种表示方式:0 0000000

4.关于补码

我们来看最后一种特殊情况:

用补码,计算一下:-1 + (-127) = -128

    1 1111111 补
+   1 0000001 补
=   1 0000000 补

得到结果:1 0000000

因为1 0000000的首位为1,表示为负数,补码需要转化为原码, 把1 0000000减1, 得到 0 1111111,再符号位不变,其余取反:0 0000000, 得到十进制:0,结果错误,问题出在哪里?还记得我们上面总结的原码的表示范围吗:-127~127,-128在8位二进制补码中没有对应的原码,他是只存在于补码系统中的特殊的数,即,在补码中,1 0000000表示-128

所以,对于8位二进制补码,其范围是-128~127

这也可以解释为什么1+127为-128:

因为得到的数值超过了计算机能表示的数值范围,上面这种情况叫做上溢,下溢则对应下面这种情况:

可以观察到:补码的表示就像一个循环,结果超过了上界,就循环到负数的位置了,超过下界,就循环到正数的位置了。像一个钟表一样,过了24点,就是1点,可以想象一下。

无符号数和有符号数的表示:

无符号数128:10000000

有符号数-128:10000000

计算机存储这两个数时,表示是一样的,那计算机是如何区分这2个数的呢?

其实计算机在存储数据时候,并不会在意这个数是正数(首位是0)还是负数(首位是1),它只负责存储数据,至于这个数据代表的含义,它不关心

对于这个数据的解释,也是根据我们的需要来实施的:

如果你把它当做是有符号数,那么10000000就是代表-128

如果你把它当做是无符号数,那么10000000就是代表128

我们会分情况确定这个数是表示正数还是负数。这就是我们在学习C语言时候,区分有符号和无符号的原因。又例如在计算机存储的是1 0001011

1 0001011,假如你把它当作无符号数,那首位就表示数值,值为139

1 0001011,假如你把它当作有符号数,那首位就表示符号位,值为-117

我们拿这两个数进行运算,只要我们自己清楚首位是不是符号位,符号位也可以参加运算,得出的结果是没问题的。

在对比128和-128的时候,会出现这2个数相等的情况吗?

不会,有符号数与无符号数比较时,有符号数会转换成无符号数来进行比较

8位无符号的128是:10000000

8为有符号的-128是:10000000,但转为8位无符号是:00000000

此时依然1000000 > 00000000

对于无符号数:
原码形式:

0000 0000 - 0111 1111            0 ~ 127(原码)
1000 0000 - 1111 1111          128 ~ 255(原码)

补码形式:

0000 0000 - 0111 1111            0 ~ 127(补码)
1000 0000 - 1111 1111          128 ~ 255(补码)

对于有符号数:

1 111 1111 - 0 111 1111        -127~127(原码)

1 000 0000 - 0 111 1111       -128~127(补码)

这里不再讲反码了,因为反码的主要作用是实现原码和补码的转换

可以总结总结补码了:

1.计算机所有的存储和计算都是通过补码的形式实现的。

2.正数补码是他本身,负数补码是其取反+1(或者说反码+1)。

3.补码中"0"表示的方式只有1种,那就是0 0000000,我们也可以发现,8位2进制数2^8=256位,每一位都有含义,原码范围-127~127,有255位数,别忘了原码中有[+0]和[-0],所以总共256位数,对于补码-128~127,总共256位数。

4.补码解决了符号位不能参与运算的问题。在用反码计算时,真值的部分是正确的,问题就出现在符号位

5.补码中有"-128",他是一个特殊的数,没有对应的原码。


有错误请佬们指出💖💖💖,后续深入学习会继续补充,别忘了收藏起来~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/843728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

allure测试报告用例数和 pytest执行用例数不相同问题

我出现的奇怪问题: pytest执行了9条用例,但是测试报告确只显示3条用例 我将其中的一个代码删除后,发现allure测试报告又正常了 我觉得很奇怪这个代码只是删除了二维数组的第一列,我检查了半天都找不到问题,只有降低版本了。导致原因:allure-pytest版本使用的是最新版本,…

机器学习-3-特征工程的重要性及常用特征选择方法

参考特征重要性:理解机器学习模型预测中的关键因素 参考[数据分析]特征选择的方法 1 特征重要性 特征重要性帮助我们理解哪些特征或变量对模型预测的影响最大。 特征重要性是数据科学中一个至关重要的概念,尤其是在建立预测性任务的模型时。想象你正在尝试预测明天是否会下…

ubuntu中idea创建spark项目步骤

1.前置条件 ubuntu中已经安装idea,jdk,scala,spark 2.打开idea,新建,选择Maven项目 3.在IDEA中,File-Setting-Plugin,下载Scala插件 4.File-project structure,导入插件 4.1在全局库中,选择导入刚才的sca…

写论文时某一行的字间距突然增大,如何解决?

问题描述: 某一行的字间距突然变大,占满了一行,检查设置也没有异常。 如何解决 一、全选出现问题的段落 二、右键,然后点击段落 三、然后勾选允许西文在单词中间换行 四、正常了

心链4---搜索页面前后端业务实现以及分布式session的共享实现

心链 — 伙伴匹配系统 搜索详情页面 之前前端的代码写到了搜索页面可以挑选搜索标签,并没有去根据具体标签搜索用户。这里就开始实现。 新建SearchResultPage.vue,并添加相关路由。 在搜索页添加搜索按钮,和触发点击。搜索页选择标签&#x…

WEB安全:Content Security Policy (CSP) 详解

Content Security Policy (CSP) 是一种强大的网页安全机制,用于防止跨站脚本 (XSS) 和其他注入攻击。通过设置一系列的内容安全策略,CSP 可以限制网页可以加载的资源,从而保护用户数据和网站的安全性。 什么是 XSS 攻击? 跨站脚本攻击 (XSS) 是一种常见的安全漏洞,攻击者…

闲鱼电商运营高级课程,一部手机学会闲鱼开店赚钱

课程下载:https://download.csdn.net/download/m0_66047725/89360471 更多资源下载:关注我。 课程内容: 10-9、怎么寻找优质的货源店铺.mp4 11-10、怎么去选择商品图片.mp4 12-11、商品图片的注意避免事项.mp4 13-12、怎么写标题.mp4 …

【Mybatis】映射文件中获取单个参数和多个参数的写法

xml的映射文件中获取接口方法中传来的参数是直接用#{}的方式来获取的 那么接下来,我们就具体来说一下获取参数里边的各种规则和用法 1.单个参数,比如上面的getOneUser,只有一个id值作为参数 Mybatis对于只有一个参数的情况下,不…

系统思考—决策

风险来自于你不知道你在做什么。——沃伦巴菲特 今天和一个合作伙伴的创始人交流,她提出了一个引人深思的问题:“策略性陪伴和战略复盘,什么原因不由客户自己来做?”这个问题让我深入思考了第三方策略性陪伴顾问的独特价值和重要…

06 Linux编程-网络编程

1、为什么需要网络编程 管道、消息队列、共享内存、信号、信号量的IPC都是依赖于系统内核的,因此这些方式无法进行多机间(例如:linux与android、linux与单片机等)的通信。 网络编程是基于网络的,因此需要网络地…

定位器与PWM的LED控制

文章目录 一、STM32定时器二、脉宽调制pwm三、定时器控制led(1)实验内容(2)创建工程(3)Keli程序(4)观察波形图(5)实物连接图(6)实践效…

一文了解MyBatis

文章目录 MyBatis1. MyBatis的执行流程2. MyBatis是否支持延迟加载3. MyBatis延迟加载的底层原理4. MyBatis的二级缓存机制用过吗5. 谈谈MyBatis框架的优势6. 简单描述MyBatis的工作原理7. MyBatis中的sql标签8. MyBatis中的${}和#{}的区别9. MyBatis中ResulyMap的作用[重要]10…

UDP网络聊天室(更)

服务器端 #include <header.h> typedef struct node {char name[20];struct sockaddr_in cli_addr;struct node *next; }node,*node_p; typedef struct msg {char type;char name[20];char text[128]; }msg; node_p create_link() {node_p H(node_p)malloc(sizeof(node)…

网络业务创新驱动下的DPU P4技术,中科驭数在网络开源技术生态大会上分享最新进展

2024年5月25日&#xff0c;由中国通信学会指导&#xff0c;中国通信学会开源技术专业委员会、江苏省未来网络创新研究院主办的第四届网络开源技术生态大会在北京举办&#xff0c;中科驭数产品总监李冬以《合作如兰&#xff0c;扬扬其香 中科驭数助力P4产业发展与生态建设》为主…

Cweek2+3

C语言学习 五.操作符 5.单目操作符(2) sizeof不能用于计算动态分配的内存 在对数组使用sizeof时&#xff0c;返回的是整个数组的大小&#xff08;所有元素的总字节数&#xff09;。而对指针使用sizeof时&#xff0c;返回的是指针本身的大小&#xff08;通常是机器字长的大小…

怎么简单的把图片缩小?图片在线改大小的方法

在日常工作中经常需要在网上上传图片&#xff0c;但是一般网上不同的平台对上传的图片大小和尺寸都会有限定的要求&#xff0c;不符合要求无法正常上传使用。所以当遇到图片太大的问题时&#xff0c;该如何快速修改图片大小&#xff0c;有很多的小伙伴都很关注这个问题的解决方…

【Qt秘籍】[002]-开始你的Qt之旅-下载

一、Qt的开发工具有哪些&#xff1f; Qt的开发工具概述Qt支持多种开发工具&#xff0c;其中最常见的开发工具是 1.QtCreator 【易上手/有少量bug/适合新手】 2.VisualStudio 【功能强大/易出错/需要更多额外配置】 3.Eclipse 【清朝老兵IDE/不建议使用】 【注意&#xff1…

【第三节】类的构造和析构函数

目录 一、数据成员的初始化 二、构造函数 2.1 什么是构造函数 2.2 构造函数的注意事项 三、析构函数 四、带参数的构造函数 五、缺省构造函数 六、构造函数初始化列表 七、拷贝构造函数和调用规则 八、深拷贝和浅拷贝 九、总结 一、数据成员的初始化 定义普通变量&am…

基于BP神经网络和小波变换特征提取的烟草香型分类算法matlab仿真,分为浓香型,清香型和中间香型

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...................................................................................... …

深入探究Java自动拆箱与装箱的实现原理

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…