当前位置: 首页 > news >正文

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,这在用一个字节表示数据的情况下是特别重要的。

相关文章:

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

前言 欢迎来到我的博客,我是雨空集(全网同名),无论你是无意中发现我,还是有意搜索而来,我都感到荣幸。这里是一个分享知识、交流想法的平台,我希望我的博客能给你带来帮助和启发。如果你喜欢我…...

数据清洗与规范化详解

数据处理流程,也称数据处理管道,是将原始数据转化为有意义的信息和知识的一系列操作步骤。它包括数据采集、清洗、转换、分析和可视化等环节,旨在提供有用的见解和决策支持。在数据可视化中数据处理是可视化展示前非常重要的一步,…...

Ansible playbook的block

环境 控制节点:Ubuntu 22.04Ansible 2.10.8管理节点:CentOS 8 block 顾名思义,通过block可以把task按逻辑划分到不同的“块”里面,实现“块操作”。此外,block还提供了错误处理功能。 task分组 下面的例子&#x…...

Jupyter Notebook还有魔术命令?太好使了

在Jupyter Notebooks中,Magic commands(以下简称魔术命令)是一组便捷的功能,旨在解决数据分析中的一些常见问题,可以使用%lsmagic 命令查看所有可用的魔术命令 插播,更多文字总结指南实用工具科技前沿动态…...

DailyRecord-231029

iOS&前端: 数组 iOS/Xcode异常:对象数组NSMutableArray添加元素-addObject,但count方法仍然返回0? - 周文 - 博客园(需要初始化) [__NSArrayI addObject:]: unrecognized selector sent to instance (检查addObj…...

雨云虚拟主机使用教程WordPress博客网站搭建教程

雨云虚拟主机(RVH)使用教程与宝塔面板搭建WordPress博客网站的教程,本文会讲解用宝塔面板一键部署以及手动安装两种方式来搭建WordPress博客,选其中一种方式即可。 WordPress WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MyS…...

【SPSS】基于RFM+Kmeans聚类的客户分群分析(文末送书)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…...

回溯法(1)--装载问题和0-1背包

一、回溯法 回溯法采用DFS+剪枝的方式,通过剪枝删掉不满足条件的树,提高本身作为穷举搜索的效率。 回溯法一般有子集树和排列树两种方式,下面的装载问题和01背包问题属于子集树的范畴。 解空间类型: 子集树&#xff1…...

[javaweb]——HTTP请求与响应协议,常见响应状态码(如:404)

🌈键盘敲烂,年薪30万🌈 目录 HTTP概述 📕概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。 📕特点: 📕插播…...

Java面向对象(进阶)-- 拼电商客户管理系统(康师傅)

文章目录 一、目标二、需求说明(1)主菜单(2)添加客户(3)修改客户(4)删除客户(5)客户列表 三、软件设计结构四、类的设计(1)Customer类…...

Qt配置OpenCV教程,亲测已试过

详细版可参考:Qt配置OpenCV教程,亲测已试过(详细版)_qt opencv_-_Matrix_-的博客-CSDN博客 软件准备:QtOpenCVCMake (QtOpenCV安装不说了,CMake的安装,我用的是:可参考博客&#x…...

【实用网站分享】

1、PyDebloatX https://pydebloatx.com/pydebloatx 是一种用于 Windows 操作系统的 Python 脚本,用于卸载 Windows 10 系统中的预装应用和系统组件,以便提高系统性能和释放磁盘空间。它是 Debloat Windows 10 脚本的一个分支,但具有更友好和…...

问题 U: 折线分割平面(类比+规律)

规律类比: 1.一个折线的角,只会对应一个部分 2.若反向延长,角对应的部分被分为3部分 (即一条折现线改为两条直线) 3.所以n条折线分成的平面数,等于2n条直线减去2n 代码实现:...

npm 彻底卸载

问题: 执行 npm -v 指令出现如下报错: ERROR: npm v10.2.1 is known not to run on Node.js v12.10.0. This version of npm supports the following node versions: ^18.17.0 || >20.5.0. 分析: 由于编译环境问题,需要更新…...

云安全-云原生技术架构(Docker逃逸技术-特权与危险挂载)

0x00 云原生技术-docker docker容器和虚拟机的对比:前者是将运行环境打包,封装一个环境。后者是将整个系统打包,封装一个系统。在操作使用上来说各有利弊。 0x01 docker容器的三种逃逸类型 特权模式启动(不安全的启动方式&…...

【Python爬虫三天从0到1】Day1:爬虫核心

目录 1.HTTP协议与WEB开发 (1)简介 (2)请求协议和响应协议 2. requests&反爬破解 (1)UA反爬 (2)referer反爬 (3)cookie反爬 3.请求参数 &#x…...

2023-10 最新jsonwebtoken-jjwt 0.12.3 基本使用

导入依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.12.3</version></dependency>包括了下面三个依赖, 所以导入上面一个就OK了 <dependency><groupId>io.jsonwe…...

云起无垠典型案例入选《2023软件供应链安全洞察》报告

近日&#xff0c;历时6个月&#xff0c;由ISC编制的《2023软件供应链安全洞察》报告&#xff08;以下简称《报告》&#xff09;正式对外发布。《报告》围绕软件供应链安全现状、技术内核、治理指南、落地实践展开&#xff0c;以期为行业从业者提供有价值的信息和洞见&#xff0…...

怎么从休学证明中取出休学原因(python自动化办公,涉及word和excel)

怎么从休学证明中取出休学原因&#xff08;python自动化办公&#xff0c;涉及word和excel&#xff09; 本代码偏向处理高校教务处的工作 休学或请假模板如下&#xff1a; 休学证明&#xff08;此联存教务办&#xff09;编号&#xff1a;休202323 计算机系23级计算机科学与技术…...

C语言 定义一个函数,并调用,该函数中打印显示直角三角形

#include<stdio.h> void chengfabiao() {for (int i 1; i < 5; i){for (int j 1; j < i; j){printf("*");} printf("\n");} } int main(int argc,const char *argv[]) {chengfabiao();return 0; }...

悟空率先接入国产最强编程模型Qwen3.6-Plus

4月2日&#xff0c;阿里巴巴正式发布新一代大语言模型Qwen3.6-Plus&#xff0c;阿里在企业级市场的旗舰AI应用悟空率先完成接入。Qwen3.6-Plus在代码、智能体、推理、原生多模态等能力上整体性能大幅增强&#xff0c;在智能体编程SWE-bench系列评测、真实世界智能体任务Claw-Ev…...

Godot资源解压器godotdec:从游戏资源保护到开发分析的技术实践

Godot资源解压器godotdec&#xff1a;从游戏资源保护到开发分析的技术实践 【免费下载链接】godotdec An unpacker for Godot Engine package files (.pck) 项目地址: https://gitcode.com/gh_mirrors/go/godotdec 在游戏开发与资源管理领域&#xff0c;Godot引擎的.pck…...

高效文件元数据管理:让Windows文件属性编辑变得简单直观

高效文件元数据管理&#xff1a;让Windows文件属性编辑变得简单直观 【免费下载链接】FileMeta Enable Explorer in Vista, Windows 7 and later to see, edit and search on tags and other metadata for any file type 项目地址: https://gitcode.com/gh_mirrors/fi/FileMe…...

解决时间选择难题:flatpickr从入门到精通指南

解决时间选择难题&#xff1a;flatpickr从入门到精通指南 【免费下载链接】flatpickr lightweight, powerful javascript datetimepicker with no dependencies 项目地址: https://gitcode.com/gh_mirrors/fl/flatpickr 识别协作痛点&#xff1a;跨国团队的时间格式困境…...

Jetson Nano/Orin上离线语音识别的实战踩坑:从Whisper到Sherpa-onnx,我最终选了它

Jetson Nano/Orin离线语音识别实战&#xff1a;从Whisper到Sherpa-onnx的技术选型与避坑指南 在边缘计算设备上实现高质量的离线语音识别&#xff08;ASR&#xff09;一直是开发者面临的挑战。Jetson系列作为NVIDIA推出的边缘AI计算平台&#xff0c;凭借其强大的GPU加速能力和低…...

如何用CodeMaker将Java/Scala开发效率提升300%?5个核心技巧带你掌握智能代码生成

如何用CodeMaker将Java/Scala开发效率提升300%&#xff1f;5个核心技巧带你掌握智能代码生成 【免费下载链接】CodeMaker A idea-plugin for Java/Scala, support custom code template. 项目地址: https://gitcode.com/gh_mirrors/co/CodeMaker 作为Java/Scala开发者&a…...

除了Omnipeek,你的8812BU网卡还能怎么玩?Win10下的另类WiFi抓包与网络诊断实战

解锁Realtek 8812BU网卡的隐藏潜能&#xff1a;Windows 10下的WiFi抓包与网络诊断全攻略 当你手握一块Realtek 8812BU无线网卡时&#xff0c;可能只把它当作普通的网络连接工具。但实际上&#xff0c;这款硬件在Windows 10环境下可以变身为强大的网络诊断利器。本文将带你探索…...

Go语言中的网络编程

Go语言中的网络编程 1. 网络编程的基本概念 网络编程是指编写在网络上进行通信的程序。在Go语言中&#xff0c;网络编程主要通过net包来实现&#xff0c;支持TCP、UDP、HTTP等多种协议。 2. TCP服务器 2.1 基本TCP服务器 package mainimport ("fmt""net" )…...

Codesys的CNC模块到底怎么用?手把手教你用WPF上位机联动,实现G代码解析与虚拟轴运动

Codesys CNC模块实战&#xff1a;WPF上位机与虚拟轴联动的G代码解析系统 1. 工业控制新范式&#xff1a;软硬件协同的虚拟调试方案 在智能制造和工业4.0背景下&#xff0c;控制系统开发正经历从传统硬件依赖到软件定义的转型。作为工业自动化领域的瑞士军刀&#xff0c;Codesys…...

汇川PLC与IS620N伺服驱动实战:手把手教你完成EtherCAT网络配置与电机命名

汇川PLC与IS620N伺服驱动深度配置指南&#xff1a;从EtherCAT组态到电机精准控制 在工业自动化领域&#xff0c;伺服系统的稳定性和响应速度直接决定了设备性能的上限。汇川AM600系列PLC搭配IS620N伺服驱动组成的EtherCAT网络&#xff0c;正成为越来越多自动化工程师的首选方案…...