C语言(07)——原码 补码 反码 (超绝详细解释)

本文的内容通下面这篇文章有着紧密的联系,读者可以选择性阅读 

C语言————二、八、十、十六进制的相互转换-CSDN博客

相关的C语言练习题和思维锻炼可以参考以下文章

C语言————练习题册(答案版)-CSDN博客

C语言————斐波那契数列的理解和运用-CSDN博客

目录

基本概念

原码 反码 补码 转换

数据的存储方式

基本存储单位

数据的计算方式

补码的模运算原理 

模运算和取余运算

移位操作符

左移操作符

右移操作符

位操作符:&、|、^、~

&的运算规则

|的运算规则

^的运算规则

~的运算规则


基本概念

我们知道不同进制的数字,归根结底都是一个个不同的表现形式 。

原码、补码和反码是整数类型在计算机内部以二进制存储时的三种不同表现形式,虽然整数具有这三种类型的存储方式,但是在内存中以补码的形式进行存储。

有符号整数在这三种方法中均由符号位数值位两部分组成,在二进制序列中,最高的一位被视为符号位,其余都是数值位。

下面我们对这三种方式进行逐一介绍:

原码:直接将数字按照二进制转换方法得到的就是原码

反码:符号位不变,其余位依次取反得到的就是反码

补码:反码+1得到的就是补码

:知道一个负整数的补码或者反码,想求这个负整数的值,那么应该将补码或者反码逆推回去得到原码,再由原码进行计算得到的值才是正确的,在计算中,符号位不参与权重,仅用以判断正负。

正整数的原码、反码、补码都相同;

原码 反码 补码 转换

负整数的原码、反码、补码有如下的转换形式(转换中符号位不变):

在对这三种形式运用的深入之前,我们先进行一个前置的知识储备。 

数据的存储方式

我们知道,计算机内部采用二进制存储所有数据,原因是电子元件(如晶体管)的 “导通” 与 “截止” 两种状态可直接对应二进制的 “1” 和 “0”,物理实现简单且稳定。

基本存储单位

我们知道一个int的字节大小为4,那么他的二进制位数为32位,接下来我们会用int来介绍三种码之间的运用方式。

数据的计算方式

在计算机中,数据的计算和存储都是通过补码来完成的。这是因为使用补码可以对符号位和数值域进行统一的处理,同时加减法也可以进行统一处理(CPU处理器只有加法器),此外,原码和补码的相互转换,二者的方式是相同的,也不需要额外的电子元件。

那为什么使用补码而不是原码呢?

原码是利用最高位表示符号(0 代表正数,1 代表负数),其余位表示数值的绝对值。不过,原码在进行加减法运算时会碰到一些难题:

  • 符号位处理复杂:在进行加减法运算时,需要先判断操作数的符号,然后再决定是进行加法还是减法运算。
  • 存在正负零:原码中存在两种零的表示方式,即+0(0000)和-0(1000),这会使比较操作变得复杂。
  • 减法运算困难:当进行减法运算时,需要设计专门的电路来执行减法操作,这增加了硬件的复杂度。

补码是通过对原码取反后加 1 得到的,它成功解决了原码存在的上述问题。

  • 统一加减法运算:在补码系统中,减法可以转换为加法来进行计算,比如A - B可以表示为A + (-B)。这样一来,计算机就不需要设计专门的减法电路,只需一个加法器就能完成加减法运算。
  • 消除正负零:在补码表示中,零只有一种表示形式,即0000。而1000则被用来表示-8,这使得数值的表示范围得到了扩展。(+0和-0的补码结果时一致的,所以只有一种表示形式
  • 简化硬件设计:由于加减法运算可以统一用加法器来实现,硬件设计变得更加简单,同时还能减少出错的概率。
    int main()
    {//1 - 1//1 + (-1)//00000000000000000000000000000001 ---- 1的原码//00000000000000000000000000000001 ---- 1的补码//00000000000000000000000000000001 ---- 1的反码//10000000000000000000000000000001 ---- -1的原码//11111111111111111111111111111110 ---- -1的反码//11111111111111111111111111111111 ---- -1的补码//那么我们用原码进行计算时我们可以得到值为10000000000000000000000000000010  即-2,与结果不符//我们使用补码进行计算时可以得到00000000000000000000000000000000    即0,数值相符return 0;
    }

    通过上述代码,我们发现,使用原码进行计算时(相当于没有考虑正负符号直接求和),得到的结果与值不符,而补码计算时完美的弥补了他的不足。

补码的模运算原理 

补码其实是一种模运算系统。对于 n 位二进制数,其模为 2ⁿ。例如,4 位二进制数的模就是 16。在模运算中,减去一个数就相当于加上这个数的补数,即x - y ≡ x + (2ⁿ - y) (mod 2ⁿ)

以 4 位二进制数计算5 - 3为例:

  • 可以转化为5 + (-3)

  • -3的补码为1101(也就是16 - 3 = 13

  • 计算5 + 13 = 18,由于模为 16,18 mod 16 = 2,结果正确。

另,整数值和其补码对应的值由如下对应关系:

  • 正数:直接表示为二进制,范围是 0 到 2^(n-1)-1

  • 负数-N 表示为 2^n - N,范围是 -2^(n-1) 到 -1

    例如,4 位补码的模是 16

  • -5 表示为 16 - 5 = 11(二进制 1011)。{取反+1得到1101即-5}

  • -8 表示为 16 - 8 = 8(二进制 1000)。{取反+1得到0000,这是错误的示范,8在4位二进制无法用原码表示,进一步体现了原码的局限性}

模运算和取余运算

在数学中,模运算表示两个数相除之后的余数,但他的结果符号和除数(分母)一致;而取余运算中的结果符号与被除数(分子)一致。

  • 模运算:在数论中,对于给定的两个整数 a(被除数)和 m(模,且 m>0),模运算的结果 r 是使得 a=q×m+r 成立的非负整数,其中 q 是商,并且 0≤r<m 。它强调的是在一个以 m 为周期的循环系统中的位置 。

  • 取余运算:取余是求两个数相除后的余数。对于整数 a 和 b(b!=0),取余运算得到的结果 r 满足 a=q×b+r ,其中 q 是商, r 的符号与被除数 a 的符号相同,并且 ∣r∣<∣b∣ 。

:两种计算对商的值处理分别为:模运算向下取整,取余运算向零取整

移位操作符

<< 为左移位操作符

>> 为右移位操作符

:他们的操作数都只能是整数,有且仅有两个操作数,只能移动非负数位

左移操作符

移动规则:左边抛弃,右边补0

对于 10 << 1 ,他的具体变化如下:

#include <stdio.h>
int main()
{int num = 10;int n = num<<1;printf("n= %d\n", n);//变成20printf("num= %d\n", num);//num不变,即不改变num自身的值return 0;
}

右移操作符

右移操作符具有两种不同的移动规则:

1.算术右移:左边用原该值的符号位填充,右边丢弃

2.逻辑右移:左边用0填充,右边丢弃

对于-10 >> 1,采用算术右移变化如下:

对于-10 >> 1,采用逻辑右移变化如下:

#include <stdio.h>
int main()
{int num = -10;int n = num>>1;printf("n= %d\n", n);//变成-5printf("num= %d\n", num);//num不变,即不改变num自身的值return 0;
}

在实际运算中,>>右移操作符采用算术右移还是逻辑右移,取决于编辑器规则;但一般情况下采用的是算术右移。 

位操作符:&、|、^、~

位操作符有: 

& ———— 按位与
 ———— 按位或
^ ———— 按位异或
~ ———— 按位取反
:他们的操作数必须是整数
&的运算规则
以两个整数的补码进行计算,对应的二进制位上,有0就为0同时为1才为1
|的运算规则

以两个整数的补码进行计算,对应的二进制位上,有1就为1同时为0才为0

^的运算规则

以两个整数的补码进行计算,对应的二进制位上,相同为0相异为1

~的运算规则

根据取反的规则,对整数的补码进行取反运算

———————————————————————————————————————————

后续会更新针对于二进制数的相关操作符

有表述不当的地方辛苦大家指出,三克油。

打怪升级中................................................................................................................................................

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

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

相关文章

磁盘坏道检测工具在美国服务器硬件维护中的使用规范

磁盘坏道检测工具在美国服务器硬件维护中的使用规范在服务器硬件维护领域&#xff0c;磁盘坏道检测工具是保障数据安全的第一道防线。本文将系统介绍美国数据中心环境下专业级磁盘诊断方案的实施标准&#xff0c;重点解析SMART检测、坏道修复算法与自动化运维流程的整合方法&am…

【n8n】如何跟着AI学习n8n【03】:HTTPRequest节点、Webhook节点、SMTP节点、mysql节点

前言 n8n的系统性学习&#xff0c;对各知识点地毯式学习&#x1f50d;~ 前面课程 定制n8n的AI老师&#xff0c;有AI老师制定学习大纲&#xff0c;参考之前的文档&#xff08;本系列n8n学习大纲&#xff0c;也在这里&#xff09;&#xff1a; 【n8n】如何跟着AI学习n8n_01&a…

Vue 的双向数据绑定原理

Vue 的双向数据绑定是通过 数据劫持 发布-订阅模式 实现的&#xff0c;具体分为以下三个关键机制&#xff1a;1. 数据劫持&#xff08;响应式系统&#xff09; Vue 使用 Object.defineProperty&#xff08;Vue 2&#xff09;或 Proxy&#xff08;Vue 3&#xff09;监听数据变化…

【基于C# + HALCON的工业视觉系统开发实战】三十五、金属表面划伤检测:强反光场景解决方案

摘要:针对金属表面强反光导致划伤检测准确率低的行业痛点,本文提出基于光度立体法的工业视觉检测方案。系统采用“硬件抗反光+算法重建”双策略,硬件上通过可编程分区环形光源、偏振镜头与高动态相机构建成像系统;算法上利用四方向光源序列图像重建表面法向量与高度场,实现…

为什么bert是双向transformer

BERT 是双向 Transformer&#xff0c;这是它的一个核心创新点。下面我从 技术原理、与传统 Transformer 的区别、以及双向性的实际意义 来详细解释为什么 BERT 被称为“双向 Transformer”。一、什么是 BERT 的“双向”&#xff1f;在 BERT 的论文中&#xff0c;双向的原文是 &…

vue中使用Canvas绘制波形图和频谱图(支持.pcm)

实现方式一&#xff1a; vue中使用wavesurfer.js绘制波形图和频谱图 安装colorMap&#xff1a; npm install --save colormap1、单个频谱图 效果&#xff1a; 源码&#xff1a; <template><div class"spectrogram-container"><canvas ref"ca…

【Python系列】Flask 应用中的主动垃圾回收

博客目录一、Python 内存管理基础二、Flask 中手动触发 GC 的基本方法三、高级 GC 策略实现1. 使用装饰器进行请求级别的 GC2. 定期 GC 的实现四、Flask 特有的 GC 集成方式1. 使用 teardown_request 钩子2. 结合应用上下文管理五、智能 GC 策略六、注意事项与最佳实践七、替代…

Linux和shell

最快入门的方式是使用苹果系统。此外&#xff0c;累计补充学习&#xff1a;一、目录结构/bin&#xff0c;二进制文件 /boot&#xff0c;启动文件 /dev&#xff0c;设备文件 /home&#xff0c;主目录&#xff0c;一般外接包、安装包放在这里 /lib&#xff0c;库文件 /opt&#x…

告别内存泄漏:你的Rust语言30天征服计划

欢迎踏上Rust学习之旅&#xff01;第一周&#xff1a;奠定基础 (Week 1: Laying the Foundation)第1天&#xff1a;环境搭建与 “Hello, World!”核心概念: 安装Rust工具链 (rustup)&#xff0c;它包含了编译器rustc和包管理器Cargo。Cargo是你的好朋友&#xff0c;用于创建项目…

乱删文件,电脑不能开机,怎么办

相信不少朋友在清理电脑、释放空间时&#xff0c;都做过一件“后悔一整年”的事——乱删系统文件。本来只是想让电脑快点、干净点&#xff0c;结果第二天一开机&#xff1a;黑屏了、蓝屏了、无限重启了&#xff0c;甚至连桌面都见不到了&#xff01;很多用户在删文件时&#xf…

ICODE SLIX2有密钥保护的物流跟踪、图书馆管理ISO15693标签读写Delphi源码

本示例使用设备&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.6781645eXF3tm5&ftt&id959258149468 一、密钥认证 procedure TForm1.Button21Click(Sender: TObject); varctrlword:byte;passwordid:byte; //密钥类型status:byte; //存…

核环境特种机器人设备的抗辐照芯片选型方案

摘要&#xff1a;核能作为国家能源安全的重要组成部分&#xff0c;对工业自动化设备的稳定性和可靠性提出了极高的要求。机器人设备在涉核环境下的日常巡检、设备维护、应急响应等任务中发挥着不可替代的作用。然而&#xff0c;涉核环境&#xff0c;尤其是高能粒子的辐照效应&a…

Linux权限系统完全指南:从本质到安全实践

一、权限的本质&#xff1a;Linux安全的核心逻辑在Linux的多用户环境中&#xff0c;权限系统通过三个关键维度实现资源隔离&#xff1a;用户标识 (UID)&#xff1a;系统通过数字ID识别用户&#xff0c;root用户的UID固定为0组标识 (GID)&#xff1a;用户组机制实现批量权限管理…

养老院跌倒漏报率↓78%!陌讯多模态算法在智慧照护中的边缘计算优化

​摘要​​&#xff1a; 针对养老场景中复杂光照与遮挡导致的跌倒漏报问题&#xff0c;陌讯视觉算法通过多模态融合与边缘计算优化&#xff0c;实测显示在RK3588 NPU硬件上实现​​mAP0.5达89.3%​​&#xff0c;较基线模型提升28.5%&#xff0c;功耗降低至7.2W。本文解析其动态…

老年护理实训室建设方案:打造安全、规范、高效的实践教学核心平台

在老龄化社会加速发展的背景下&#xff0c;培养高素质、技能过硬的老年护理专业人才迫在眉睫。一个设计科学、功能完备的老年护理实训室&#xff0c;正是院校提升实践教学质量&#xff0c;对接行业需求的核心平台。本方案旨在构建一个安全、规范、高效的现代化实训环境。点击获…

OpenCv中的 KNN 算法实现手写数字的识别

目录 一.案例&#xff1a;手写数字的识别 1.安装opencv-python库 2.将大图分割成10050个小图&#xff0c;每份对应一个手写数字样品 3.训练集和测试集 4.为训练集和测试集准备结果标签 5.模型训练与预测 6.计算准确率 7.完整代码实现 一.案例&#xff1a;手写数字的识别…

TCP/IP 传输层详解

TCP/IP 传输层详解 传输层&#xff08;Transport Layer&#xff09;是 TCP/IP 模型的第四层&#xff08;对应 OSI 模型的传输层&#xff09;&#xff0c;核心功能是实现 端到端&#xff08;进程到进程&#xff09;的可靠通信。主要协议包括&#xff1a; TCP&#xff08;传输控制…

深度学习笔记:Overview

本文根据吴恩达老师的深度学习课程整理而来&#xff0c;在此表示感知。 文章目录1.课程笔记2.编程作业1.课程笔记 1&#xff09;深度学习笔记&#xff08;1&#xff09;&#xff1a;神经网络基础 2&#xff09;深度学习笔记&#xff08;2&#xff09;&#xff1a;浅层神经网络…

LLM之RAG理论(十八)| ChatGPT DeepResearch 深度研究功能全面技术分析报告

一、背景与行业环境1.1 DeepResearch 的诞生与战略意义ChatGPT DeepResearch&#xff08;深度研究&#xff09;是 OpenAI 于 2025 年 2 月 3 日正式发布的全新 AI 智能体产品&#xff0c;是继 o3-mini 模型发布后&#xff0c;OpenAI 在 AI 研究领域的又一重大突破。这一功能的推…