一篇文章让你搞懂原码,反码,补码!

目录

1.机器数和机器数真值

1.1机器数

1.2机器数的真值

2.原码,反码,补码的计算方法

2.1原码

2.2反码

2.3补码

3.为什么要使用反码和补码? 

3.1原码不能让符号位参与运算的问题: 

3.2为了解决原码作减法,引入反码

3.3为了解决0的符号问题,引入补码

4.深入反码和补码背后的意义

4.1钟表的例子 

4.2反码的定义:

4.3补码的定义:

4.4反码和补码计算方法的由来


1.机器数和机器数真值

1.1机器数

机器数是指计算机内部用来表示数值的二进制数。机器数通常包括符号位和数值位,其中符号位用于表示正负,数值位用于表示数的大小。计算机处理和存储数据时,使用的是机器数。

示例: 对于十进制数 +5 和 -5,其机器数表示如下(假设使用8位二进制表示):

  • +5:0000 0101
  • -5:1000 0101

1.2机器数的真值

机器数的真值是指该机器数在实际应用中的十进制值。真值可以通过机器数的符号位和数值位来确定。符号位为0表示正数,符号位为1表示负数。

示例:

  • 机器数 0000 0101 的真值是 +5
  • 机器数 1000 0101 的真值是 -5

2.原码,反码,补码的计算方法

原码,反码,补码等都是对机器数的存储形式,也即表示方法。

  • 机器数是一种广义的概念,指计算机中用二进制表示的数值。
  • 原码是一种具体的表示方法,用最高位表示符号,其余位表示数值。
  • 反码用于负数表示,负数的反码是其原码的数值位逐位取反。
  • 补码在计算机中广泛使用,负数的补码是其原码的数值位逐位取反后加1。

速记:

2.1原码

原码(Sign-Magnitude)是一种表示有符号数的方法。原码的最高位(符号位)表示数值的正负,其余位表示数值的大小。符号位为0表示正数,符号位为1表示负数。

示例: 对于十进制数 +5 和 -5,其原码表示如下(假设使用8位二进制表示):

  • +5:0000 0101
  • -5:1000 0101

2.2反码

反码(Ones' Complement)是一种表示负数的方法。正数的反码与其原码相同;负数的反码是将其原码的数值位逐位取反(即0变1,1变0),符号位保持不变。

示例: 对于十进制数 +5 和 -5,其反码表示如下(假设使用8位二进制表示):

  • +5:0000 0101
  • -5:1111 1010(先取原码1000 0101,然后数值位逐位取反)

2.3补码

补码(Two's Complement)是计算机中广泛使用的一种表示有符号数的方法。正数的补码与其原码相同;负数的补码是将其原码的数值位逐位取反后加1。补码的优点是加减运算可以统一处理,简化了计算过程。

示例: 对于十进制数 +5 和 -5,其补码表示如下(假设使用8位二进制表示):

  • +5:0000 0101
  • -5:1111 1011(先取原码1000 0101,然后数值位逐位取反得到1111 1010,再加1得到1111 1011)

3.为什么要使用反码和补码? 

3.1原码不能让符号位参与运算的问题: 

        现在我们知道了计算机可以有三种编码方式表示一个数,对于正数因为三种编码方式的结果都相同:

真值原码反码补码
[+1][0000 0001][0000 0001]反[0000 0001]补

        所以不需要过多解释,但是对于负数:

真值原码反码补码
[-1][1000 0001][1111 1110]反[1111 1111]补

        可见负数的原码,反码和补码是完全不同的。既然原码才是被人脑直接识别并用于计算表示方式,为何还会有反码和补码呢?

        首先, 因为人脑可以知道第一位是符号位,在计算的时候我们会根据符号位,选择对真值区域的加减。(真值的概念在本文最开头)

         但是对于计算机,要设计的尽量简单,计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂!

        于是人们想出了将符号位也参与运算的方法。我们知道,根据运算法则减去一个正数等于加上一个负数,即:1-1 = 1 + (-1) = 0, 所以机器可以只有加法而没有减法,这样计算机运算的设计就更简单了。

于是人们开始探索将符号位参与运算,并且只保留加法的方法。

首先来看原码:

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

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

如果用原码表示,让符号位也参与计算,显然对于减法来说,结果是不正确的。这也就是为何计算机内部不使用原码表示一个数

3.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.3为了解决0的符号问题,引入补码

1-1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [0000 0001]补+ [1111 1111]补= [1 0000 0000]补 【注意:进位1不在计算机字长里。】= [0000 0000]补= [0000 0000]原 = 0

这样0用[0000 0000]表示,而以前出现问题的-0则不存在了。而且可以用[1000 0000]表示-128:-128的由来如下:

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

-1-127的结果应该是-128,在用补码运算的结果中,[1000 0000]补就是-128,但是注意因为实际上是使用以前的-0的补码来表示-128,所以-128并没有原码和反码表示。

(对-128的补码表示[1000 0000]补,算出来的原码是[0000 0000]原,这是不正确的)

使用补码,不仅仅修复了0的符号以及存在两个编码的问题,而且还能够多表示一个最低数。这就是为什么8位二进制,使用原码或反码表示的范围为[-127, +127],而使用补码表示的范围为[-128, +127]。

因为机器使用补码,所以对于编程中常用到的有符号的32位int类型,可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位,而使用补码表示时又可以多保存一个最小值。

4.深入反码和补码背后的意义

4.1钟表的例子 

假设需要将钟表从六点调到三点:有两种方式

1.时针逆时针往前拨三格;

 

2.时针顺时针往后拨九格。 

 

钟表就是一个会回绕的一位十二进制的计算系统:

从1数到12后又会从1开始从头数到12。

如上我们想计算 6-3 = 3的时候可以通过 6 + (12-3) = 3而得出结果;

我们说在这个计算系统中3和9是关于12互补的,也即是3关于12的补数是9,在计算

一个数减去一个数时,可以通过一个数加上这个数的补数来同样得出结果。

这种现象同样在二级制的N位计算机系统中存在。

4.2反码的定义:

反码(Ones' Complement)的本质

        英文名字:Ones' Complement ,对一个数关于 "1" 进行求补码。这个 "1" 本质上是一个有限位计数系统里所能表示的最大值。以下是具体解释:

有限位计数系统中的最大值

在不同的进制和位数的系统中,最大值不同:

  • 8 位二进制中的最大值是 1111 1111(255)。
  • 1 位十进制中的最大值是 9
  • 3 位十六进制中的最大值是 FFF(4095)。

反码的性质

反码的构造方式使得以下性质成立:

  • 一个正数的反码与其原码相同。
  • 一个负数的反码加上它的原码的绝对值等于 2^n-1(也就是该计算系统中能表示的最大值)。

数学表示

反码的计算可以表示为:

[x]反 = ( M − |x| )

其中,M 是系统中的最大值。例如,在 8 位二进制系统中,M = 255(即 1111 1111)。

关于最大值对一个数求补

反码实际上是通过对最大值减去一个数来得到:

  • 在 8 位二进制中,最大值是 1111 1111。对一个数 x 求反码就是用 1111 1111 减去 x的绝对值
  • 结果体现的是将 x 的数值位每一位取反,即 0110

 

按位取反

这种减法操作在二进制系统中直接体现为按位取反:

  • 例如,x = 0000 0101(十进制的 5)
  • 反码为 1111 1010(十进制的 250,即 255 - 5

        总的来说,在开头讲的反码的计算方法只是求一个二进制数的反码在具体计算时的具体体现而已。 而这种减法得出的结果是将原码的数值位按位取反的体现也是反码名字的由来。

4.3补码的定义:

        英文名字: Two's Complement,对一个数关于“二”求补,这个二指的是一个N位计算系统的容量也即2^N,也叫做模。

计数系统的容量(模)

计数系统的容量(模)是指系统所能表示的所有不同状态的总数。例如:

  • 对于 4 位二进制数(不考虑符号),其容量是 24=162^4 = 1624=16。
  • 对于 1 位符号位和 4 位数值位,总共 5 位二进制数,容量是 25=322^5 = 3225=32。

补码的性质

补码的构造方式使得以下性质成立:

  • 一个正数的补码与其原码相同。
  • 一个负数的补码加上它的原码的绝对值等于 2^n(也就是该计算系统的模)。

补码的计算公式

补码的计算公式为:

[x]补 = (模 - |x|)

其中,模是计数系统的容量。例如,对于 4 位二进制数,模是 16

为什么补码可以让有符号数直接做加法

补码的一个核心特点是,它将减法运算转换成了加法运算。具体来说,对于一个 n 位二进制数系统,给定两个有符号整数 x 和 y,x - y 可以通过 x + (-y) 来实现,其中 -y 是 y 的补码。

补码系统中的“回绕”

在补码系统中,4 位二进制数的范围是从 0000 到 1111。当结果超过 1111(或小于 0000)时,它会自动回绕。例如:

  • 1111 (补码 -1) 加 1 得到 0000(补码 0),这就像钟表从 11 点走到 12 点,然后重新开始。
  • 0000 (补码 0) 减 1 得到 1111(补码 -1),这就像钟表从 12 点走到 11 点。

下面通过一个四位二进制计算系统来举例:

所有码值作为补码代表的数
00000
00011
00102
00113
01004
01015
01106
01117
1000-8
1001-7
1010-6
1011-5
1100-4
1101-3
1110-2
1111-1

该计算系统可以类比于一个会回绕的钟表:

假如现在要计算4-2的值:

4 - 2 = 4 + (-2) = 2

减去一个数等于加上这个数的补码

[0100]补 + [1110]补 =[10010]补

溢出一位,我们不管,系统自动回绕:

[0010]补表示的就是2,可见结果正确。

该过程在图上可以表示为:

而像这种为了弥补反码中零的两种表示方式的漏洞,正是补码名字的由来。

4.4反码和补码计算方法的由来

       总体来讲,反码和补码都是利用一个计算系统在不断的累加之后会出现回绕的现象用来正确处理加法的溢位,这样只要不超出该计算系统所表是数值的范围的运算就可以通过这个计算系统来计算相应的加减法。

在一个n位的二进制计算系统中; 

        对于求反码:

[x]反 = (2^n - 1) - |x|

        具体计算时的体现就是数值位按位取反;

        对于求补码:

[x]补 = 2^n - |x|

联立二式,就可以推出,补码是原码数值位按位取反后的结果加上1,同时也是反码加1。

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

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

相关文章

SAP支出管理,企业成本控制的智能钥匙

在企业运营中,有效的支出管理是确保财务健康和提升竞争力的关键。SAP支出管理系统作为企业资源规划的核心组成部分,提供了一套全面的解决方案,帮助企业实现成本控制、风险管理和合规性监督。实现支出管理流程自动化,并主动管理更多…

python爬虫预备知识三-序列化和反序列化

序列化和反序列化 序列化是为了将内存中的数据保存在磁盘上或者用于传输,实现程序状态的保存和共享。反序列化反之。 序列化后的变量再被反序列化回来之后,两者之间已经没有任何关系。 序列化后的文件是在不同程序或者说不同语言之间传递数据的关键方…

分享5款.NET开源免费的Redis客户端组件库

前言 今天大姚给大家分享5款.NET开源、免费的Redis客户端组件库,希望可以帮助到有需要的同学。 StackExchange.Redis StackExchange.Redis是一个基于.NET的高性能Redis客户端,提供了完整的Redis数据库功能支持,并且具有多节点支持、异步编…

[Git][分支管理][上]详细讲解

目录 1.理解分支2.创建分支3.切换分支4.合并分支5.删除分支 1.理解分支 感性理解:分支可以理解为平行宇宙,但是在用户需要的时候,可以将两个平行宇宙合并,此时两个平行宇宙的效果将会"叠加"理性理解:每次提…

TCP 和 UDP 之间的区别?

从 连接,可靠性,传输方式等方面: TCP 是面向连接的协议,在发送数据的时候需要先通过 TCP 的三次握手,而 UDP 是无连接的协议,可以直接传输数据TCP 通过超时重传,流量控制和拥塞控制等方法保障了…

使用JWT的SpringSecurity实现前后端分离

1. SpringSecurity完成前后端完全分离 分析: 前后端分离:响应的数据必须为JSON数据,之前响应的是网页 需要修改的代码有: 登录成功需要返回json数据登录失败需要返回json数据权限不足时返回json数据未登录访问资源返回json数据 1.…

二叉树的前序遍历 - 力扣(LeetCode)C语言

144. 二叉树的前序遍历 - 力扣(LeetCode)(点击前面链接即可查看题目) 一、题目 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3]示例 2: …

文心智能体【MBTI速测小精灵】:趣味速测,精准解析你的性格密码!

文章目录 一、文心智能体平台是什么?二、创建文心智能体智能体创建智能体调试分析智能体基础配置智能体高级配置智能体高级调试 三、文心智能体发布四、文心智能体体验总结 一、文心智能体平台是什么? AgentBuilder文心智能体平台是基于文心大模型的智能…

适用于 Android 的 6 大视频恢复软件榜单 – 恢复您的珍贵回忆!

失去珍贵的回忆可能是一种令人心碎的经历,尤其是在您的 Android 设备上拍摄视频时。无论是由于意外删除、格式化、系统崩溃还是任何其他不可预见的情况,丢失珍贵视频的想法都会造成巨大的痛苦。但不要担心!在这篇博文中,我们将深入…

临床随机对照试验中的分层问题及其解决方法

在临床随机对照试验(Randomized Controlled Trials, RCTs)中,分层问题(Stratification Issues)是影响研究结果有效性的重要因素之一。RCTs是评估医疗干预效果的金标准,旨在通过随机分组和对照来消除干扰因素…

在亚马逊云科技AWS上利用ElasticSearch和RAG搭建个性化推荐系统

简介: 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案,帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践,并应用到自己的日常工作里。 本次介绍用当下热门的RAG和大语言模型&#xf…

[WUSTCTF2020]朴实无华1

打开题目 扫目录用dirsearch扫,为节省建议只扫常见的目录,配置是: ./dirsearch.py -e bak,zip,txt,tgz,php -u http:..... -s 3 -t 20 访问一下 根据提示,再访问一次 提示不在这,抓包看看 根据提示,改ge…

页面根据sse返回的流,逐句展示内容,达到gpt效果

之前的文章里,我写到了关于怎么获取sse中的流,但是缺少逐句展示的效果,这次来补齐。 比如这种,实现难点在于,当返回的markdown语法,不是完整的语句时,展示的代码块会错乱。 实现代码 app.vue …

P10477 题解

题目传送门 题目传送门(洛谷) Step1 理解题意 一共有 T T T 组数据有一个地铁,有一个中心车站(即为根),有一个人从中心车站出发。对于每组数据,给定两个同样长度的01串 s 1 s_1 s1​ , s …

内网安全:多种横向移动方式

1.MMC20.Application远程执行命令 2.ShellWindows远程执行命令 3.ShellBrowserWindow远程执行命令 4.WinRM远程执行命令横向移动 5.使用系统漏洞ms17010横向移动 DCOM: DCOM(分布式组件对象模型)是微软的一系列概念和程序接口。它支持不同…

C语言--函数

1. 函数定义 语法: 类型标识符 函数名(形式参数) {函数体代码 } (1)类型标识符 --- 数据类型(函数要带出的结果的类型) 注:数组类型不能做函数返回结果的类型,如果函…

Tomcat 8.5 下载、安装、启动及各种问题

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 本期内容主要介绍 Tomcat 8 的安装,以及可能会遇到的问题 文章目录 1. Tomcat 安装2. 可能会遇到的问题2.…

【vluhub】skywalking

SkyWalking是一个开源监控平台,用于从服务和云原生基础设施收集、分析、聚合和可视化数据 低版本存在sql注入漏洞 访问地址 http://192.168.203.12:8080/graphql burpsuite抓数据包 替换 {"query":"query queryLogs($condition: LogQueryConditi…

机器学习 第9章-聚类

机器学习 第9章-聚类 9.1 聚类任务 在“无监督学习”(unsupervised learning)中,训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律,为进一步的数据分析提供基础。此类学习任务中研究最多、应用最广…

计算机毕业设计选题推荐-学生作业管理系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…