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

目录

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",他是一个特殊的数,没有对应的原码。


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

英语新概念2-回译法-lesson1 和 lesson17

Lesson 1 私人谈话A private conversation 翻译: Last Sunday I went to the theater. My seat was good and the play was interesting, but I can not enjoy it. A young man and a young woman sat behind me and they were talking loudly. I felt angry becau…

计算机组成原理----移码

在网上搜索移码是什么,大概率会搜到一个结论:移码是补码符号位取反,可是真的是这样吗? 传统的有符号整数是将二进制数的首位作为符号位,0表示正数,1表示负数。 但在移码中,我们不再使用单独的符号位来表示正负。而是通过一个固定的偏置量来将所有可能的指数值映射到一个无符…

windows 执行node报错 800A1391

在项目下执行node -v的时候,抛了这个错误,一开始没发现有啥问题 现在一看,这个报错里的node怎么是个文件... 出现这个问题,是因为项目下,有个同名的文件叫node.js,搞得windows一时不知道是想打开node.js文…

基于粒子群算法的网络最优节点部署优化matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于粒子群算法的网络最优节点部署优化,实现WSN网络的节点覆盖最大化。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 3.核心程序 .................…

【Unity】颜色混合计算

在图形渲染中,颜色混合(Color Blending)是指将多个颜色值组合在一起以生成最终显示的颜色。颜色混合技术广泛用于处理半透明效果、光照效果和后期处理效果。以下是一些常见的颜色混合模式: 1. 正常混合(Normal Blendi…

高通Android 12/13 设置和获取ADB状态

/*** 设置ADB状态** param isEnable*/public void setADB(boolean isEnable) {Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.ADB_ENABLED, isEnable ? 1 : 0);}/*** 获取ADB状态** return*/public boolean getADB() {return Settings.Global.getIn…

灵动微单片机洗衣机方案——【软硬件开发支持】

RAMSUN英尚以洗衣机洗涤主驱电机为例,主驱电机和多电机控制首选MM32SPIN0280.灵动微电子能够提供完整的软硬件开发支持,目前方案已经在主流家电厂出货。 洗衣机方案 皮带洗衣机 DD直驱洗衣机 波轮洗衣机 Mini壁挂和桌面洗衣机 洗涤烘干双变频方案 热泵烘…

太速科技-16通道24bit 256kHZ 的振动信号千兆网络采集器

16通道24bit 256kHZ 的振动信号千兆网络采集器 一、产品概述 数据采集器是一台运行Linux操作系统的智能终端,在以太网络的支持下,可迅速构建起大规模的分布式智能数据采集系统。采集器终端体积小,功耗低,易集成&#xff0c…

开源博客项目Blog .NET Core源码学习(29:App.Hosting项目结构分析-17)

本文学习并分析App.Hosting项目中后台管理页面的按钮管理页面。   按钮管理页面用于显示、新建、编辑、删除页面按钮数据,以便配置后台管理页面中每个页面的工具栏、操作栏、数据列中的按钮的事件及响应url。按钮管理页面附带一新建及编辑页面,以支撑新…

浙江大学数据结构MOOC-课后习题-第九讲-排序3 Insertion or Heap Sort

题目汇总 浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024 题目描述 测试点 思路分析 和上一题的思路一样&#xff0c;每进行一次迭代&#xff0c;来验证当前序列是否和给定的序列相同 代码展示 #include <cstdlib> #include <iostream> #define MAXSIZE 10…

【错误记录】HarmonyOS 运行报错 ( Failure INSTALL _PARSE _FAILED _USESDK _ERROR )

文章目录 一、报错信息二、问题分析三、解决方案 一、报错信息 在 DevEco Studio 中 , 使用 远程设备 , 向 P40 Failure[INSTALL_PARSE_FAILED_USESDK_ERROR] compileSdkVersion and releaseType of the app do not match the apiVersion and releaseType on the device. 二、…

『香橙派』基于Orange Pi AIpro打造高效个人云存储解决方案

&#x1f4e3;读完这篇文章里你能收获到 了解Orange Pi AIpro硬件优势&#xff0c;为构建高效云存储基础设施的理想平台。学会使用Orange Pi AIpro硬件平台&#xff0c;搭载Ubuntu Server系统&#xff0c;打造云存储环境。掌握利用Kodbox软件&#xff0c;享受文件管理、多格式…

使用vanna实现Text2SQL

这节一起用vanna来实现自然语言转SQL&#xff0c;之前的大模型一直停留在问答阶段&#xff0c;答案基本都是大模型提供的&#xff0c;至多是加点本地知识库&#xff0c;tet&#xff0c;pdf等文档&#xff0c;丰富大模型的内容&#xff0c;但是想要大模型与一些管理系统对接还是…

ESXI8.0虚拟机和主机之间进行粘贴复制

1&#xff1a;默认情况下新建一个虚拟机是无法和主机之间进行粘贴复制操作的&#xff0c;主要是为了安全。 2&#xff1a;可以参考下面的文档进行操作&#xff0c;操作成功也只能复制粘贴数据&#xff0c;而无法复制粘贴文件或文件夹 https://knowledge.broadcom.com/externa…

JavaSE:StringBuilder和StringBuffer类

1、引言 在上一篇文章中&#xff0c;我们理解了字符串的常用方法&#xff0c;细心的同学大概已经发现&#xff0c;不管是将字符串中的字符转变为大写或小写&#xff0c;或是完成字符串的替换&#xff0c;又或是去除空白字符等等&#xff0c;只要涉及到字符串的修改&#xff0c…

玩转STM32-I2C通信协议(详细-慢工出细活)

文章目录 一、I2C总线原理&#xff08;掌握&#xff09;1.1 硬件构成1.2 传输位1.3数据传输格式 二、STM32的I2C特性和结构三、STM32的I2C通信实现&#xff08;硬件实现方式&#xff09;3.1 I2C主模式 四、应用实例 一、I2C总线原理&#xff08;掌握&#xff09; 1.1 硬件构成…

软件测试经理工作日常随记【6】-利用python连接禅道数据库并自动统计bug数据到钉钉群

测试管理_利用python连接禅道数据库并统计bug数据到钉钉 这篇不多赘述&#xff0c;直接上代码文件。 另文章基础参考博文&#xff1a;参考博文 加以我自己的需求优化而成。 统计的前提 以下代码统计的前提是禅道的提bug流程应规范化 bug未解决不删除bug未关闭不删除 db_…

解读makefile中$(patsubst pattern,replacement,text)

在 Makefile 中&#xff0c;$(patsubst pattern,replacement,text) 是一个用于模式替换的函数&#xff0c;它可以将文本中符合指定模式的部分替换为指定的字符串。这个函数通常用于对文件名或路径进行模式匹配和替换&#xff0c;非常适合在 Makefile 中进行文件名的转换操作。 …

计算机毕业设计python+spark天气预测 天气可视化 天气大数据 空气质量检测 空气质量分析 气象大数据 气象分析 大数据毕业设计 大数据毕设

摘 要 近些年大数据人工智能等技术发展迅速&#xff0c;我国工业正努力从“制造”迈向“智造”实现新跨越。神经网络(NeuronNetwork)是一种计算模型&#xff0c;通过大量数据的学习&#xff0c;来发现数据之间的模式和规律&#xff0c;模仿人脑神经元的工作方式。随着算力的提…

【深度学习】Transformer梳理

零、前言 对于transformer&#xff0c;网上的教程使用记号、术语不一 。 最关键的一点&#xff0c;网上各种图的简化程度不一 &#xff08;画个图怎么能这么偷懒&#xff09; &#xff0c;所以我打算自己手画一次图。 看到的最和善&#xff08;但是不是那么靠谱&#xff0c;我…