二进制原码、反码、补码、移码

  • 机器数:一个数在计算机中的二进制表示形式,称为这个数的机器数。
  • 符号位:机器数是带符号的,在计算机中用最高位作为符号位,0为正数,1为负数。
  • 真值:机器数由于含有符号位,所以机器数的值并不等于真实值。将带符号位的机器数所对应的真实数值称为机器数的真值。
  • 为便于计算,带符号的机器数可采用原码、反码、补码、移码等不同编码方式。
  • 原码:是最简单的机器数表示法,用最高位表示符号,其余位表示该数的二进制绝对值。
  • 反码:正数的反码是其本身,负数的反码是符号位不变,其余位取反。(在反码中,数值0有两种表示方法)(原码最大的问题就在于一个数加上它的相反数不等于0,反码的设计思想就是为了解决这个问题,既然一个负数是一个正数的相反数,那干脆用一个正数按位取反来表示负数)

此时,再试着用反码的方式解决一下源码的问题:0000 0001 + 1111 1110 = 1111 1111,即1+(-1)= -0 结果正确;1111 1110 + 1111 1100 = 1111 1010,(-1)+(-3)= -5,结果错误。两个相反数相加等于0,但是两个负数相加结果不对。

  • 补码:正数的补码是其本身,负数的补码是其反码+1。(这只是求法,并不是补码定义)
  • 移码:不管正负数,只要将其补码的符号位取反即可。
  • 八位二进制数0000 0000 ~ 1111 1111 共2^{8}=256个数,如果无符号整数可表示0~255。如果是有符号整数,第一位二进制位为符号位,其余位为数值域。
  • 在原码中,0的表示有两种(+0)0000 0000和(-0)1000 0000,这样就产生了编码映射的不唯一性,在计算机上就要去区分,然而+0和-0并没有现实意义。
  • 为解决上述数的表示问题,我们强制把转换后的1000 0000认定为-128,但这又出现了一个新的问题,即数的运算
  • 为解决上述数的运算问题,进行如下思考:在数学上,1+(-1)=0,而在二进制中,0000 0001 + 1000 0001=1000 0010,换算成十进制为-2,显然是错了。所以原码符号位不能直接参与运算,必须和其他位分开,但这增加了硬件的开销和复杂性。这个时候就要引入补码。为何引入补码?负数补码定义为何是相应的正数原码取反加一?
  • 为何引入补码?是为了解决计算机中数的表示和数的运算问题,使用补码,可以将符号位和数值域统一处理,即引用了模运算在数理上对符号位的自动处理,利用模的自动丢弃,实现了符号位的自然处理,仅仅通过编码的改变就可以在不更改机器物理架构的基础上完成预期要求。
  • 为何取反加一?模的概念可以帮助理解补数和补码。“模”指的是一个计量系统的计量范围。如时钟的计量范围是0~11,模=12;n位计算机的计量范围是0~2^{n-1},模=2^{n}。“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法运算为加法运算。例如:当前时针指向10点,而准确时间是6点,调整时间有以下两种拨法:一种是倒拨4个小时,即10-4=6;另一种是顺拨8小时,即10+8=12+6。在以12为模的系统中,加8和减4的效果是一样的,因此可以化减法运算为加法运算。对“模”而言,8和4互为补数。在以12为模的系统中,11和1,10和2,9和3,7和5, 6和6都有这个特性,共同特点是两者之和等于模。对于计算机而言,其概念和方法完全一样,n位计算机,假设n=8,不讨论符号位,则所能表示最大的数是1111 1111,若再加1,成为10000 0000,但因为只能有8位,最高位1自然丢失。又回到了0000 0000,所以8位二进制系统的模为2^{8}。在这样的系统中,减法运算也可化为加法运算,只需把减数用相应的补数表示就可以,把补数用到计算机对数的处理上,就是补码。
  • 正数的补码表示就是其本身,负数的补码表示的实质是把负数映像到正值区域,因此加上一个负数或减去一个正数,可以用加上另一个数(负数或减数对应的补码)来代替。从补码表示的符号看,补码中符号位的值代表了数的正确符号,0表示正数,1表示负数;而从映像值来看,符号位的值是映像值的一个数位,因此在补码运算中,符号位可以与数值位一起参加运算。
  • 八位二进制数表示范围为-128~+127。

举例:

不考虑符号位:

0110-0010,6-2=4,但是由于计算机中没有减法器,没法算。这时候,想想时钟运算中,减去一个数,是可以等同于加上另外一个正数(同余数),这个数与减数相加正好等于模。也就是四位二进制数最大容量是多少?其实就是2^4=16(10000)。那么-2的同余数,就等于10000-0010=1110,16-2=14。既然如此,0110-0010=0110+1110=10100,6-2=6+14=20。按照这种算法得出的结果是10100,但是对于四位二进制数最大只能存放4位,如果低四位正好是0100,正好是想要的结果,至于最高位的1,计算机会把它放入psw寄存器进位位中,8位机会放在cy中,x86会放在cf中,这里不做讨论。此时,再想想在四位二进制数中,减去2就相当于加上它的同余数(至于它们为什么同余,建议看《计算机组成原理》)。但是减去2,从另一个角度来说,也是加上-2,即加上-2和加上14得到的二进制结果除了进位位,结果是一样的。如果我们把1110的最高位看作符号位后就是-2的补码,这可能也是为什么负数的符号位是1,而不是0。

       

在补码中也不存在-0了,因为1000表示-8。

参考文献:(强烈推荐第一个引用文献

(5 封私信) 为什么-8对应的原码、补码是1000,反码是1111? - 知乎 (zhihu.com)

《 模拟工程师口袋书》

二进制的原码、反码、补码 - 知乎 (zhihu.com)

八位二进制数能表示数的范围以及原码、反码和补码含义_8位2进制-CSDN博客

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

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

相关文章

搭建项目环境,集成ts和jest

前言 开新坑。 斥巨资购入大崔哥的 mini-vue 课程,为了改变自己东一榔头西一棒槌的学习状态,也是因为深刻思考了自己身无长物浑浑噩噩这么多年只会敲代码,别无出路,也只能提升自己继续走技术这条路,那提高技术绕不过…

6.HTML中表格标签

6.表格标签 表格是实际开发中非常常用的标签 6.1 表格的主要作用 表格主要用于显示、展示数据,因为它可以让数据显示的非常规整,可读性非常好。特别是后台展示数据的时候,能够熟练运用表格就显得十分重要。一个清爽简约的表格能够把繁杂的数据…

维基百科是非营利性机构 词条内容具有中立性、准确性、可靠性

维基百科对一些企业很有神秘性,自行操作很多次也没有成功建立维基百科,这一定是没有按照维基百科的规则和流程去操作。小马识途营销顾问提醒企业,维基百科是一种基于协作的在线百科全书,由维基媒体基金会运营。维基百科的创建流程…

React Virtual DOM及Diff算法

JSX到底是什么 使用React就一定会写JSX,JSX到底是什么呢?它是一种JavaScript语法的扩展,React使用它来描述用户界面长成什么样子,虽然它看起来非常像HTML,但他确实是javaScript,在React代码执行之前&#…

上海亚商投顾:沪指震荡反弹 鸿蒙、算力概念股集体爆发

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日窄幅震荡,创业板指冲高回落,市场热点继续轮动。华为鸿蒙概念股继续活跃&#…

“具有分布式能源资源的多个智能家庭的能源管理的联邦强化学习”文章学习一

一、摘要 本文提出了一种新型的联邦强化学习(FRL)方法,用于管理带有家电、太阳能光伏系统和储能系统的多个智能家庭的能源。 所提出的FRL方法的创新点在于开发了一种由本地家庭能源管理系统(LHEMS)和全局服务器(GS)组成的分布式深度强化学习(…

.net core中前端vue HTML5 History 刷新页面404问题

放到启动的应用程序的最后面 app.Run(async (context) > {context.Response.ContentType "text/html";await context.Response.SendFileAsync(Path.Combine(env.WebRootPath, "index.html")); });https://blog.csdn.net/lee576/article/details/88355…

实现线程的多种方式锁的介绍ThreadLocal线程池 详细总结(下)

本文主要介绍线程池的基本使用 上述其他介绍在上一篇文章中:实现线程的多种方式&锁的介绍&ThreadLocal&线程池 详细总结(上)-CSDN博客 线程池 5.1、为什么使用线程池 线程池可以看做是管理了 N 个线程的池子,和连…

Java的XWPFTemplate word生成列表

Java的XWPFTemplate工具类导出word.docx的使用_xwpftemplate 语法_youmdt的博客-CSDN博客 如果是表格的列表参考上面这篇文章即可,比较复杂的列表遍历暂时还没找到方法,只能手动创建表格了 上面是模板,非常简单,以为我们是要自己创…

高效免费办公神器——ONLYOFFICE入手指南

前言: 作为开发者,有时候经常为寻找适合的开发工具而苦恼;或者因为高昂的费用而犹豫不决;亦或喜欢的办公产品只能在单一的平台上使用,与其把时间花在复杂的工具使用上,不如节省出时间投入思考和技术的提升。…

云课五分钟-01课程在哪里-无需安装网页直达

此部分课程均为2015-2019年规划和设计,2020-2022年新版课程还在内测中。 现在想想当年还是很莽的,总想着一个网页云服务,把机器人相关不涉及硬件的课程全囊括。 无需安装个性定制即开即用随时随地云端复现…… 视频 云课五分钟-01课程在哪…

C++设计实现日志系统

转载:C设计实现日志系统 - 知乎 (zhihu.com) 日志系统几乎是每一个实际的软件项目从开发、测试到交付,再到后期的维护过程中极为重要的 查看软件代码运行流程、 还原错误现场、 记录运行错误位置及上下文等的重要依据。一个高性能的日志系统&#xff0c…

【ArcGIS Pro微课1000例】0032:创建具有指定高程Z值的矢量数据

本文讲解ArcGIS Pro中创建具有指定高程值的矢量数据的两种方法。 文章目录 一、独立创建1. 新建地图场景2. 新建shapefile3. 绘制多边形4. 添加高程字段5. 三维显示二、基于高程源创建1. 创建栅格范围2. 添加Z值字段3. 添加Z信息4. 要素更新Z值一、独立创建 1. 新建地图场景 …

Pytorch多GPU并行训练: DistributedDataParallel

1 模型并行化训练 1.1 为什么要并行训练 在训练大型数据集或者很大的模型时一块GPU很难放下,例如最初的AlexNet就是在两块GPU上计算的。并行计算一般采取两个策略:一个是模型并行,一个是数据并行。左图中是将模型的不同部分放在不同GPU上进…

【vue】AntDV组件库中a-upload实现文件上传:

文章目录 一、文档&#xff1a;二、使用(以Jeecg为例)&#xff1a;【1】template&#xff1a;【2】script&#xff1a; 三、效果图&#xff1a; 一、文档&#xff1a; Upload 上传–Ant Design Vue 二、使用(以Jeecg为例)&#xff1a; 【1】template&#xff1a; <a-uploa…

Springboot项目返回数据统一封装

Springboot项目返回数据统一封装,支持swagger。 正常swagger会根据数据库表的注释显示对应的参数释义等。但当我们使用统一接口返回map时&#xff0c;部分注释等信息会被掩盖消失。在此提供三个java类即可满足统一封装返回接口&#xff0c;也可显示对应的swagger释义等。 1.Er…

Vue 2学习(路由、history 和 hash 模式、)-day014

一、路由简介 路由&#xff08;route&#xff09;就是一组 key-value 的对应关系多个路由&#xff0c;需要经过路由器&#xff08;router&#xff09;的管理 在 Vue 中也有路由&#xff0c;Vue 中的路由主要是通过 vue-rounter 这个插件库来实现&#xff0c;它的作用就是专门用…

php 插入排序算法实现

插入排序是一种简单直观的排序算法&#xff0c;它的基本思想是将一个数据序列分为有序区和无序区&#xff0c;每次从无序区选择一个元素插入到有序区的合适位置&#xff0c;直到整个序列有序为止 5, 3, 8, 2, 0, 1 HP中可以使用以下代码实现插入排序算法&#xff1a; functi…

【考研复习】二叉树的特殊存储|三叉链表存储二叉树、一维数组存储二叉树、线索二叉树

文章目录 三叉链表存储二叉树三叉链表的前序遍历&#xff08;不使用栈&#xff09;法一三叉链表的前序遍历&#xff08;不使用栈&#xff09;法二 一维数组存储二叉树一维数组存储二叉树的先序遍历 线索二叉树的建立真题演练 三叉链表存储二叉树 三叉链表结构体表示如下图所示…

2023-11-15 LeetCode每日一题(K 个元素的最大和)

2023-11-15每日一题 一、题目编号 2656. K 个元素的最大和二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你需要执行以下操作 恰好 k 次&#xff0c;最大化你的得分&#xff1a; 从 nums 中选择一个元素 m 。将选中…