原码、补码、反码

news2025/1/21 4:53:14

一、前置概念

计算机底层存储数据时使用的是二进制数字,但是计算机在存储一个数字时并不是直接存储该数字对应的二进制数字,而是存储该数字对应二进制数字的补码。所以接下来我们需要来了解一下原码、反码和补码

那么再了解原码、反码、补码之前,我们要了解机器数和真值的概念:

1) 机器数

一个数在计算机的存储形式是二进制数,我们称这些二进制数为机器数,机器数是有符号,在计算机中用机器数的最高位存放符号位,0表示正数,1表示负数

2) 真值

因为机器数带有符号位,所以机器数的形式值不等于其真实表示的值(真值),以机器数1000 0001为例,其真正表示的值(首位为符号位)为-1,而形式值(首位就是代表1)为129;因此将带符号的机器数的真正表示的值称为机器数的真值

二、原码、反码、补码介绍

1) 原码

原码的表示与机器数真值表示的一样,即用第一位表示符号,其余位表示数值。也就是

正数:就是它对应的二进制数。
负数:将绝对值对应的二进制最左边位变为1。

例如的十进制的的正负1,用8位二进制的原码表示如下:

+1= 原:[ 0000 0001 ]-1= 原:[ 1000 0001 ]

2) 反码

正数 : 和原码相同。
负数 : 在其原码的基础上,符号位不变,其余各位取反。

+1= 原: [ 0000 0001 ] = 反:[ 0000 0001 ]-1= 原:[ 1000 0001 ] = 反:[ 1111 1110 ]

3) 补码

正数 : 补码是其原码本身。
负数 : 补码是在其原码的基础上,符号位不变,其余各位取反后加1(即在反码的基础上加1)。

+1= 原: [ 0000 0001 ] = 反:[ 0000 0001 ] = 补:[ 0000 0001 ]-1= 原:[ 1000 0001 ] = 反:[ 1111 1110 ] = 补:[ 1111 1111 ]

三、 数据在计算机中的存储形式

计算机实际只存储补码,所以原码转换为补码的过程,也可以理解为数据存储到计算机内存中的过程:

https://pic4.zhimg.com/80/v2-526897c7f151205d79a9ec7006486c63_1440w.webp

在原、反、补码中,正数的表示是一模一样的,而负数的表示是不相同的,所以对于负数的补码来说,我们是不能直接用进制转换将其转换为十进制数值的,因为这样是得不到计算机真正存储的十进制数的,所以应该将其转换为原码后,再将转换得到的原码进行进制转换为十进制数(机器数包含符号位

四、为何使用原码、反码、补码

我们上面说过,原码、反码、补码的表示对于正数来说都是一样的,而对于负数来说,三种码的表示确是完全不同的,那大家是否会有个疑问:如果原码才是我们人类可以识别并用于直接计算的表示方式,**那为什么还会有反码和补码?**计算机直接存储原码不就完事了?

在解决这些问题前,我们先来了解计算机的底层概念,我们人脑可以很轻松的知道机器数的第一位是符号位,但对于计算机基础电路设计来说判别第一位是符号位是非常难和复杂的事情,为了让计算机底层设计更加简单,人们开始探索将符号位参与运算,并且采用只保留加法的方法,我们知道减去一个数,等于加上这个数的负数,即:1-1 = 1 + (-1) = 0,这样让计算机运算就更加简单了,并且也让符号位参与到运算中去

五、原码、补码、反码演进的过程

提醒:前提是已经完全掌握上面的原码、反码、补码介绍

1) 使用原码运算

计算十进制表达式:1-1 = 0

1 - 1 = 1 + (-1)
= 原:[ 0000 0001 ] + 原:[ 1000 0001 ]
= 原:[ 1000 0010 ] = -2

结论:如果用原码表示,让符号位也参与计算,对于减法来说,结果是不正确的这也是计算机内部在存储数据时不使用原码的原因,为了解决这一问题,出现了反码。

2) 使用反码运算

计算十进制表达式:1-1 = 0

1 - 1 = 1 + (-1)
= 原:[ 0000 0001 ] + 原:[ 1000 0001 ]
= 反:[ 0000 0001 ] + 反:[ 1111 1110 ]
= 反:[ 1111 1111 ] = 原: [ 1000 0000 ] = -0

结论:通过计算我们发现用反码计算减法,**结果的真值部分是正确的。**而唯一的问题出现在"0"这个特殊的数值上,虽然人们理解上+0和-0是一样的,但是0带符号是没有任何意义的,而且会有[0000 0000]原和[1000 0000]原两个编码表示0。为了解决这一问题,出现了补码。

3) 使用补码运算

1 - 1 = 1 + (-1)

= 原:[ 0000 0001 ] + 原:[ 1000 0001 ]
= 补:[ 0000 0001 ] + 补:[ 1111 1111 ]
= 补: [ 0000 0000 ] = 原: [ 0000 0000 ] = 0

结论:这样0用[0000 0000]表示,而以前出现问题的-0则不存在了,而且人们还发现可以用[1000 0000]表示-128,-128的推算过程如下:

(-1) + (-127) = -128
= 原:[1000 0001] + 原:[ 1111 1111 ]
= 补:[ 1111 1111 ] + 补:[ 1000 0001 ]
= 补:[ 1000 0000 ]

注意:因为实际上是使用以前的-0的补码来表示-128,所以-128并没有原码和反码表示,只要补码是[1000 0000],其十进制数值就为-128。

4) 演进总结:

因为补码能多存储一个**-128**,而且在计算机底层中存储的是补码,所以在计算机中一个8位的二进制数的存储范围是用补码表示的**[-128,127],而不是用原码或反码表示的[-127,127]。这也可以解释为什么计算机中一个字节的取值范围是[-128,127]**。

最后也能够回答我们开始提出的问题了,原码、反码、补码的使用,是人们为了让符号位能参与运算并让计算机底层运算更加简单而设计出来的数据存储表示方式

六、总结(牢记)

  1. 二进制的最高位是符号位:0表示正数,1表示负数(把 1 平放就是负号 ‘-’)。

  2. 正数的原码反码补码都一样,三码合一。

  3. 负数的反码 = 它的原码符号位不变,其它位取反。

  4. 负数的补码 = 它的反码 + 1, 负数的反码 = 负数的补码 - 1 。

  5. 0 的反码、补码都是 0 。

  6. Java没有无符号数,换言之Java中的数都是有符号的。

  7. 在计算机运算的时候都是以 “补码” 的方式来运算的。

  8. 当我们看运算结果的时候,要看它的原码(重点)。

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

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

相关文章

自动执行探索性数据分析 (EDA),更快、更轻松地理解数据

一、说明 EDA是 exploratory data analysis (探索性数据分析 )的缩写。所谓EDA就是在数据分析之前需要对数据进行以此系统性研判,在这个研判后,得到基本的数据先验知识,在这个基础上进行数据分析。本文将在R语言和python语言的探索性处理。 摄…

Hadoop学习:深入解析MapReduce的大数据魔力之数据压缩(四)

Hadoop学习:深入解析MapReduce的大数据魔力之数据压缩(四) 4.1 概述1)压缩的好处和坏处2)压缩原则 4.2 MR 支持的压缩编码4.3 压缩方式选择4.3.1 Gzip 压缩4.3.2 Bzip2 压缩4.3.3 Lzo 压缩4.3.4 Snappy 压缩4.3.5 压缩…

蔡司关注全民运动眼健康:与蔡司智锐镜片KEEP住视力健康

众所周知,运动是对我们身体最大的投资,但是对于视力有问题的消费者来说,不合适的眼镜无疑是运动路上的绊脚石,跑步运动时眼镜总是往下掉,不仅没有相对稳定的视野,还特别没安全感,由此可见一副优…

1.物联网LWIP网络,TCP/IP协议簇

一。TCP/IP协议簇 1.应用层:FTP,HTTP,Telent,DNS,RIP 2.传输层:TCP,UDP 3.网络层:IPV4,IPV6,OSPF,EIGRP 4.数据链路层:Ethernet&#…

售后工单管理系统是什么?售后服务管理系统对企业有什么作用?

售后服务管理系统可以提高客户满意度、提升售后服务效率、实现客户关系管理、支持知识库和员工培训、以及数据分析和改进等多种作用,从而帮助企业提高售后服务质量和效率,增强客户忠诚度,提高整体运营效率。 1、集成化信息平台   系统可以实…

基于迁移学习的基础设施成本优化框架,火山引擎数智平台与北京大学联合论文被KDD收录

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 基于迁移学习的基础设施成本优化框架,火山引擎数智平台与北京大学联合论文被KDD收录 近期,第29届国际知识发现与数据挖掘大会(A…

android cocoscreator 检测模拟器还是真机

转载至 一行代码帮你检测Android模拟器 具体原理看原博主文章,这里只讲cocoscreator3.6的安卓工程怎么使用 1.新建一个com.lahm.library包,和com.cocos.game同目录,如图示 那四个文件的代码如下: EmulatorCheckUtil类&#…

国产化系统中遇到的视频花屏、卡顿以及延迟问题的记录与总结

目录 1、国产化系统概述 1.1、国产化操作系统与国产化CPU 1.2、国产化服务器操作系统 1.3、当前国产化系统的主流配置 2、视频解码花屏与卡顿问题 2.1、视频解码花屏 2.2、视频解码卡顿 2.3、关于I帧和P帧的说明 3、国产显卡处理速度慢导致图像卡顿问题 3.1、视频延…

【Git】Git中用到的一些命令

Git文件有四种状态: 未跟踪未修改(已跟踪)已修改(已跟踪)已暂存(已跟踪) 通常我们将项目clone下来就会处于已跟踪状态 1、git diff命令 git diff:查看没有暂存的文件更新哪些部分…

Linux安装Solr-8.9.0

Solr的工作原理可以简单地概括为以下几个步骤: 1. 索引创建:首先,Solr需要创建一个索引,用于存储要搜索的数据。索引是基于Apache Lucene构建的,它将文档拆分为字段,并对字段进行分析和标记化,以…

Nature | 人工智能模型越大就越好吗?

随着生成式人工智能模型(AI)变得越来越大、越来越强大,一些AI科学家开始提倡更精简、更节能的系统。针对这个趋势,著名科技杂志《Nature》最近发表Anil Ananthaswamy博士的专题文章“人工智能模型总是越大型越好吗?”&…

vue3 + antv/x6 实现拖拽侧边栏节点到画布

前篇:vue3ts使用antv/x6 自定义节点 前篇:vue3antv x6自定义节点样式 1、创建侧边栏 用antd的menu来做侧边栏 npm i --save ant-design-vue4.x//入口文件main.js内 import Antd from ant-design-vue; import App from ./App; import ant-design-vue/…

redis 发布和订阅

目录 一、简介 二、常用命令 三、示例 一、简介 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。Redis 客户端可以订阅任意数量的频道。下图展示了频道 channel1 ,以及订阅这个频道的三个客户…

编程语言学习笔记-架构师和工程师的区别,PHP架构师之路

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责…

ROS机器人启动move base时代价地图概率性无法加载的原因及解决方法

最近,使用ROS机器人,在启动move_base 节点时,概率性会出现全局和局部代价地图不加载的问题,此时,发布目标点也无法启动路径规划。而且该问题有时候出现概率很低,比如启动10次,会有1次发送该情况…

ASEMI逆变器专用整流桥GBU812参数,GBU812规格

编辑-Z GBU812参数描述: 型号:GBU812 最大峰值反向电压(VRRM):1200V 平均整流正向电流(IF):8A 正向浪涌电流(IFSM):200A 工作接点温度和储存温度(TJ, Tstg):-55 to 150℃ 最大热阻(RθJC)&#xff1…

node fs模块readFileSync报错SyntaxError: Unexpected token ‘*‘

node fs模块readFileSync报错SyntaxError: Unexpected token * 1.问题再现2.解决方法 1.问题再现 使用node的fs模块readFileSync读取文件时,报错了SyntaxError: Unexpected token 。文件的读取路径是没有问题的。 看到好像是读不了""也。 2.解决方法 …

08 Ubuntu安装docker || 四十五秒极速安装!真的极快,我使用了镜像

因为我是Ubuntu系统的,所以我下面只演示Ubuntu系统。 我使用的是“清华镜像”所提供的步骤,如果你曾多看过我几篇博客,就知道我真的十分喜欢使用清华镜像。 文末附带其他版本安装方式。 1 (删除旧版本) 如果你以前…

Anaconda详细安装过程

一、前言 Anaconda是一个开源的Python和R编程语言的发行版本,用于数据科学、机器学习、人工智能和科学计算。它提供了一个集成的平台,包含了大量的开源工具、库和软件包,方便用户进行数据分析、处理和建模。 二、实验环境 WIndows10、11 …

leetcode 415.字符串相加

⭐️ 题目描述 🌟 leetcode链接:https://leetcode.cn/problems/add-strings/description/ ps: 从两个字符串的末尾开始遍历,依次相加,若大于等于 10 则使用一个变量记录进位,遍历的时候若两个字符串其中一…