List 3.5 详解原码、反码、补码

 前言

欢迎来到我的博客,我是雨空集(全网同名),无论你是无意中发现我,还是有意搜索而来,我都感到荣幸。这里是一个分享知识、交流想法的平台,我希望我的博客能给你带来帮助和启发。如果你喜欢我的文章,别忘了收藏、点赞、关注,以便获取最新的内容。你还可以在文章下方留下你的想法和反馈,我非常欢迎你的意见。我会继续努力提供优质的内容。期待与你一起分享知识、互相学习,并建立一个积极的社区。让我们一起在这个知识之旅中取得进步!

本博客文章已收录至我的Java SE专栏,如需阅读其他有关博客笔记请转至该专栏下

传送门 -->Java SE_程序员雨空集


原码

原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负

利用原码对正数进行计算是不会有问题的。

十进制是逢十进一,不会出现10这个数字。

二进制是逢二进一,不会出现2这个数字。


原码的示例

比如十进制56转成二进制就是00111000。

00111000中,最左边的0就是代表这个数为正数,其余的0111000代表56,也就是下面这个样子。

其中,一个0或者一个1就代码1bit(中文翻译叫比特位)。

计算机里是通常是把8个bit分为一组,叫做一个byte(字节),而字节是计算机中最小的存储单元。

而一个字节最大值表示为01111111,转化成十进制就是+127,是正的127。

最左边的符号位取0,其余位为数据,因为是求最大,每位上全部取最大为1。

而一个字节最小值表示为11111111,转化成十进制就是-127,是负的127。

最左边的符号位取1,其余位为数据,因为是求最小,每位上全部取最小也为1 。


原码的弊端

又举个例子

现在有一个字节代表的数是-0,也就是0,如下图

如果我现在要对它进行+1操作,也就是下面这样

按理说0+1=(+1),但是根据上图,这样做的话就粗问题了,按照二进制的规则,这样操作的二进制转成十进制为-1,也就是下图才是我们想要的结果

如果在此实际值上再进行+1操作,又出现了下面的情况

为什么会出现这样的情况呢?

想要理解清楚,需要结合数轴去理解

如果我要用二进制表示0的基础上+1,但是因为符号位是1代表负数,实际是在0的位置上往负的方向前进的1单位,如下图所示

所以这就是原码的弊端:在原码的基础上,如果是负数计算,结果就出错,实际运算的结果,跟我们预期的结果是相反的。

如果我们结合上面的数轴,在进行负数计算的时候,如果把数轴的方向倒转一下,那不就得到了我们想要的结果了吗?因此,这就引出了反码的由来


反码

反码:为了解决原码不能计算负数的问题而出现的

计算规则:

  • 正数的反码不变。
  • 负数的反码在原码的基础上,符号位不变。数值取反,0变1,1变0。

为什么正数的反码不变?

  • 因为正数之间的计算是没有任何问题,只有我们上面举到的例子中有负数的计算才会有反码的出现

反码的示例

又又举个栗子

十进制-56的二进制原码是10111000。根据规则,符号位不变。数值取反,0变1,1变0。它的反码为11000111

验证反码能不能解决原码负数计算的问题,我们可以验证一下

就看看-56+1的值是不是为-55的这个情况?

  • -56的原码是10111000,而-56的反码就是11000111。
  • 进行-56+1的操作就是在-56的反码11000111从最右边的数字进1位根据二进制逢二进一变为11001000
  • 而55的原码是0011011,所以-55的原码就是1011011,所以-55的反码就是1100100,结果成立!

这么一来,你就懂了吧?如果还没明白,把上面的步骤多看几遍,你就懂了


反码的弊端

又又又举个例子,我现在

现在又一个十进制数字-2,其原码是1000 0010,其反码为1111 1101

  • 如果对-2进行+1操作之后,其原码变为1000 0001,反码变为1111 1110,结果为-2+1=-1,没问题
  • 如果对-2进行+2操作,也就是两次+1操作,原码会变成1000 0000 ,反码变为1111 1111,结果为-2+2=0 也没问题
  • 如果对-2进行+3进行操作,也就是三次+1错做,原码会变成0000 0000,反码编程0000 0000,结果为-2+3=0,到这里就不对起来了?

为什么会出现这样的情况呢?

就是因为二进制对于0的表达有两种方式,如下图表格所示

十进制数

原码

反码

+0

0000 0000

0000 0000

-0

1000 0000

1111 1111

-1

1000 0001

1111 1110

-2

1000 0010

1111 1101

怎么解决呢?这就引出了补码的由来

当初的哪些计算机大佬是那么想的:既然反码计算到0的时候会因为有2个0的表达方式而造成计算误差,那我把反码中的两个0的表达方式屏蔽一个不就好了嘛。所以就有了补码的出现

十进制数

原码

反码

补码

+0

0000 0000

0000 0000

0000 0000

-0

1000 0000

1111 1111

0000 0000

-1

1000 0001

1111 1110

1111 1111

-2

1000 0010

1111 1101

1111 1110

这样就可以把0的两种表现形式给屏蔽掉了,但是这里的补码是为了有负数、有反码的计算。

如果全部是正数的计算就用原码计算即可


补码

补码:为了解决反码不能计算负数超过0的问题而出现的

补码的示例

先把上面的表拿下来

十进制数

原码

反码

补码

+0

0000 0000

0000 0000

0000 0000

-0

1000 0000

1111 1111

0000 0000

-1

1000 0001

1111 1110

1111 1111

-2

1000 0010

1111 1101

1111 1110

-3

1000 0011

1111 1100

1111 1101

-4

1000 0100

1111 1011

1111 1100

举例一个跨0的情况,进行-4+5的操作

  • -4的补码是1111 1100
  • 5是一个正数。正数的原码、反码、补码的值都是一样的,所以补码为0000 0101
  • 把两者补码进行相加操作,得到补码0000 0001,表示十进制的数就是1,成功!

这么一来,你就懂了吧?如果还没明白,把上面的步骤多看几遍,你就懂了


补码的小细节

因为补码是在反码的基础上+1得到的,所以-127的补码就是1000 0001,所以就会空出一位,因为+0和-0的补码是相同的,就会节省出一个补码跑到最下面,如下图所示

十进制数

原码

反码

补码

+0

0000 0000

0000 0000

0000 0000

-0

1000 0000

1111 1111

0000 0000

-1

1000 0001

1111 1110

1111 1111

-2

1000 0010

1111 1101

1111 1110

-3

1000 0011

1111 1100

1111 1101

-4

1000 0100

1111 1011

1111 1100

......

......

......

......

-126

1111 1110

1000 0001

1000 0010

-127

1111 1111

1000 0000

1000 0001

-128

1000 0000

因为补码的这个特性,-128是特殊规定的,因此没有原码和反码。但是这也不影响,因为计算机中数字的存储和运算都是以补码为基础进行的


总结

原码是用来表示十进制数据的一种二进制形式,最左边的一位是符号位,0表示正数,1表示负数。但是,原码不能直接用于负数计算,如果用原码进行负数计算,结果会出错,实际运算的方向与正确运算的方向相反。


反码是为了解决原码不能计算负数的问题而出现的。对于正数,反码和原码一样;对于负数,反码是在原码的基础上将符号位不变,数值位全部取反(即0变1,1变0)。然而,反码也存在一个问题,那就是如果负数的计算结果跨过0,那么结果会比实际结果多1。


补码则是为了解决反码不能计算负数超过0的问题而出现的。对于正数,补码和原码、反码一样;对于负数,补码是在反码的基础上加1。这样,负数就可以正确地用补码表示了。此外,补码还可以多记录一个特殊的值-128,这在用一个字节表示数据的情况下是特别重要的。

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

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

相关文章

Ubuntu ARMv8编译Qt源码以及QtCreator

最近需要在NVIDIA小盒子上面跑一个程序,一开始想着在Ubuntu x64下交叉编译一版,后来发现libqxcb.so 这个库在configure时就会一直报错,多方查找怀疑可能是由于硬件不支持在x64环境下编译AMR架构的xcb库。 所以最后在ARM下直接编译Qt源码了&am…

word页脚设置,页脚显示第几页共有几页设置步骤

word页脚设置,页脚显示第几页共有几页设置步骤: 具体步骤: 步骤1: 步骤1.1选择页脚---空白页脚 步骤1.2,在"[在此处键入]",直接输入你需要的格式,如 “第页/共页” 步骤1.3选择第“…

数据分析和互联网医院小程序:提高医疗决策的准确性和效率

互联网医院小程序已经在医疗领域取得了显著的进展,为患者和医疗从业者提供了更便捷和高效的医疗服务。随着数据分析技术的快速发展,互联网医院小程序能够利用大数据来提高医疗决策的准确性和效率。本文将探讨数据分析在互联网医院小程序中的应用&#xf…

Vue图片路径问题(动态引入)

vue项目中我们经常会遇到动态路径的图片无法显示的问题,以下是静态路径和动态路径的常见使用方法。 1.静态路径 在日常的开发中,图片的静态路径通过相对路径和绝对路径的方式引入。 相对路径:以.开头的,例如./、../之类的。就是…

pytorch笔记:TRIPLETMARGINLOSS

1 介绍 创建一个衡量三元组损失的标准,给定输入张量 x1​、x2​ 和 x3​ 以及一个大于0的间距值。这用于测量样本之间的相对相似性。一个三元组由a、p和n组成(锚点、正例和负例)。所有输入张量的形状都应为 (N,D) 2 基本使用方法 torch.nn.…

iPhone手机屏幕分辨率

ios app测试时,需要测试应用在不同型号的苹果手机上的表现形式,可以自己在浏览器上配置。 代数设备逻辑像素尺寸缩放发布时间第一代iPhone 2G320 x 480480 x 3203.5寸1x2007年6月29日第二代iPhone 3320 x 480480 x 3203.5寸1x2008年7月11日第三代iPhone …

前端 :用HTML和css制作一个小米官网的静态页面

1.HTML&#xff1a; <body><div id "content"><div id "box"><div id "top"><div id "top-left"><span id "logo">MI</span><span id "text-logo">小米账…

机器视觉3D项目评估的基本要素及测量案例分析

目录 一. 检测需求确认 1、产品名称&#xff1a;【了解是什么产品上的零件&#xff0c;功能是什么】 2、*产品尺寸&#xff1a;【最大兼容尺寸】 3、*测量项目&#xff1a;【确认清楚测量点位】 4、*精度要求&#xff1a;【若客户提出的精度值过大或者过小&#xff0c;可以和客…

【API篇】十、生成Flink水位线

文章目录 1、水位线的生成原则2、有序流内置水位线3、乱序流内置水位线4、自定义周期性水位线生成器5、自定义断点式水位线生成器6、从数据源中发送水位线 1、水位线的生成原则 水位线出现&#xff0c;即代表这个时间之前的数据已经全部到齐&#xff0c;之后不会再出现之前的数…

Kafka KRaft模式探索

1.概述 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。其核心组件包含Producer、Broker、Consumer&#xff0c;以及依赖的Zookeeper集群。其中Zookeeper集群是Kafka用来负责集群元数据的管理、控制器的选举等。 2.内容…

CAD2024最新中文版安装教程分享

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;cad24 获取 AutoCAD是目前计算机辅助设计领域最流行的CAD软件&#xff0c;此软件功能强大、使用方便&#xff0c;在国内外广泛应用于机械、建筑、家居、纺织等诸多行业。CAD制图软件具有良好的用户界面&#xff0c;通过交互…

【HarmonyOS】鸿蒙操作系统架构

HarmonyOS架构 一. 鸿蒙系统定位二. 架构整体遵从分层设计三. HarmonyOS具有的技术特性四. HarmonyOS有三大特征 其它相关推荐&#xff1a; 软考系统架构之案例篇(架构设计相关概念) 系统架构之微服务架构 系统架构设计之微内核架构 所属专栏&#xff1a;系统架构设计师 一. 鸿…

人工智能之深度学习

1. 引言 时至今日&#xff0c;人们常用的计算机程序几乎都是软件开发人员从零编写的。 比如&#xff0c;现在开发人员要编写一个程序来管理网上商城。 经过思考&#xff0c;开发人员可能提出如下一个解决方案&#xff1a; 首先&#xff0c;用户通过Web浏览器&#xff08;或移动…

如何将本地 PDF 文件进行翻译

在日常工作和学习中&#xff0c;我们经常会遇到需要翻译 PDF 文件的情况。比如&#xff0c;我们需要将一份英文的技术文档翻译成中文&#xff0c;或者将一份中文的法律文件翻译成英文。 传统上&#xff0c;我们可以使用专业翻译软件或服务来翻译 PDF 文件。但是&#xff0c;这…

使用Gateway解决跨域问题时配置文件不生效的情况之一

首先html文件只有一个发送ajax请求 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&q…

【鸿蒙软件开发】ArkTS基础组件之Gauge(环形图表)、LoadingProgress(动态加载)

文章目录 前言一、Gauge环形图表1.1 子组件1.2 接口参数介绍 1.2 属性1.3 示例代码二、LoadingProgress2.1 子组件2.2 接口2.3 属性2.4 示例代码 总结 前言 Gauge&#xff1a;数据量规图表组件&#xff0c;用于将数据展示为环形图表。 LoadingProgress&#xff1a;用于显示加载…

公网远程访问macOS本地web服务器

# 公网访问macOS本地web服务器【内网穿透】 文章目录 1. 启动Apache服务器2. 公网访问本地web服务2.1 本地安装配置cpolar2.2 创建隧道2.3 测试访问公网地址3. 配置固定二级子域名3.1 保留一个二级子域名3.2 配置二级子域名4. 测试访问公网固定二级子域名 以macOS自带的Apache…

Azure云工作站上做Machine Learning模型开发 - 全流程演示

目录 本文内容先决条件从“笔记本”开始设置用于原型制作的新环境&#xff08;可选&#xff09;创建笔记本开发训练脚本迭代检查结果 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0…

Android应用:实现网络加载商品数据【OKHttp、Glide、Gson】

实现网络加载商品数据的功能&#xff1a; 1、在AndroidManifest.xml中声明网络权限&#xff1b; 2、在app/build.gradle中添加okhttp, glide, gson等必需的第3方库&#xff1b; 3、在MainActivity中通过OkHttpClient连接给定的Web服务&#xff0c;获取商品数据&#xff1b;对…

Ubuntu安装VM TOOLS解决虚拟机无法和WINDOWS粘贴复制问题

1&#xff1a;首先使用VMware Workstation安装一个Ubuntu的系统。 2&#xff1a;现在已经不建议安装VM TOOLS。建议安装OPEN-VM-TOOLS。 3&#xff1a;进入系统使用下面的命令安装。 sudo apt install open-vm-tools 4&#xff1a;提示下面错误&#xff0c;Package open-vm…