在 C 语言中,原码、反码、补码的运算规则与其编码特性密切相关,核心差异体现在符号位是否参与运算、进位如何处理以及减法是否能转化为加法等方面。以下是三者的运算规则及特点分析(以 8 位整数为例,符号位为最高位):

一、原码的运算规则

原码是 “符号位 + 数值绝对值” 的直接表示,其运算规则需单独处理符号位,且加法和减法需分开逻辑,灵活性差。

1. 加法运算
  • 若两数符号相同(同正或同负):

符号位不变(仍为 0 或 1),数值位直接相加;若数值位相加后有进位,结果可能溢出(超出表示范围)。

示例:+3(00000011) + +5(00000101)

符号位均为 0,数值位相加:0000101 + 000011 = 0001000,结果为00001000(+8,正确)。

  • 若两数符号不同(一正一负):

需先比较两数数值位的绝对值大小,用 “大绝对值 - 小绝对值”,结果的符号取 “绝对值大的数” 的符号。

示例:+5(00000101) + (-3)(10000011)

绝对值 5 > 3,符号取正(0),数值位相减:0000101 - 0000011 = 0000010,结果为00000010(+2,正确)。

2. 减法运算

原码减法需转化为 “被减数 + 减数的相反数”,再按加法规则处理(符号相反时的加法逻辑)。

示例:+5(00000101) - (+3)(00000011)

等价于 +5 + (-3),按符号不同的加法规则计算,结果为 + 2(正确)。

原码运算的缺陷
  • 符号位需单独判断,运算逻辑复杂(需比较绝对值、区分加减);
  • 存在两个 0(+0 和 - 0),可能导致运算结果歧义;
  • 实际中几乎不用于计算机运算(仅用于直观表示)。

二、反码的运算规则

反码是原码到补码的过渡编码,其运算规则允许符号位参与运算,但需处理 “循环进位”(最高位进位需回加到最低位),可实现减法转加法,但仍有缺陷。

1. 加法运算
  • 符号位与数值位一起参与加法(按二进制加法规则,逢 2 进 1);
  • 若最高位(符号位)产生进位,需将该进位 “循环” 加到结果的最低位(称为 “循环进位”);
  • 运算结果仍为反码,需转换为原码才能得到实际值。

示例 1:+3(反码00000011) + +5(反码00000101)

直接相加:00000011 + 00000101 = 00001000(无进位),结果反码为 00001000,对应原码 + 8(正确)。

示例 2:+5(反码00000101) + (-3)(反码11111100)

相加:00000101 + 11111100 = 100000001(最高位产生进位 1);

循环进位:将进位 1 加到最低位,00000001 + 1 = 00000010;

结果反码为 00000010,对应原码 + 2(正确)。

示例 3:+1(反码00000001) + (-1)(反码11111110)

相加:00000001 + 11111110 = 11111111(无进位);

结果反码为 11111111,对应原码 - 0(存在双 0 问题,不完美)。

2. 减法运算

反码减法可直接转化为 “被减数 + 减数的反码”(因负数的反码是其相反数的反码),再按加法规则处理(含循环进位)。

示例:+5 - (+3) 等价于 +5 + (-3),同上述示例 2,结果正确。

反码运算的缺陷
  • 需处理循环进位,硬件实现稍复杂;
  • 仍存在 - 0(11111111),导致 0 的表示不唯一;
  • 未彻底解决运算问题,仅作为补码的过渡。

三、补码的运算规则

补码是计算机中实际使用的编码,其运算规则最简单:符号位直接参与运算,进位直接丢弃,减法可完美转化为加法,且结果唯一正确。

1. 加法运算
  • 符号位与数值位一起参与加法(按二进制加法规则,逢 2 进 1);
  • 若最高位(符号位)产生进位,直接丢弃该进位(因超出位数的部分不影响结果);
  • 运算结果仍为补码,无需额外处理即可表示正确值。

示例 1:+3(补码00000011) + +5(补码00000101)

相加:00000011 + 00000101 = 00001000(无进位),结果补码为 00001000,对应 + 8(正确)。

示例 2:+5(补码00000101) + (-3)(补码11111101)

相加:00000101 + 11111101 = 100000010(最高位产生进位 1);

丢弃进位:结果为 00000010,对应 + 2(正确)。

示例 3:+1(补码00000001) + (-1)(补码11111111)

相加:00000001 + 11111111 = 100000000(进位 1);

丢弃进位:结果为 00000000(唯一的 0,正确)。

2. 减法运算

补码减法可直接转化为 “被减数 + 减数的补码”(因减去一个数 = 加上它的相反数,而负数的补码是其相反数的补码),再按加法规则处理(进位丢弃)。

公式:a - b = a + (-b)的补码

示例:+5 - (+3) = +5 + (-3)的补码

-3 的补码为 11111101,相加结果同示例 2,得 + 2(正确)。

补码运算的优势
  • 符号位自然参与运算,无需单独判断;
  • 减法完全转化为加法,简化硬件设计(只需加法器);
  • 只有一个 0(00000000),结果无歧义;
  • 进位直接丢弃,逻辑简单,是计算机中整数运算的唯一实现方式。

四、无符号数的运算规则

无符号数(unsigned)没有符号位,其原码、反码、补码完全相同(即二进制数值本身),运算规则为:

  • 加法:按二进制加法,进位直接丢弃(超出位数的部分无效);
  • 减法:按二进制减法,若被减数小于减数,结果为 “模” 减去(减数 - 被减数)(等价于补码运算,因无符号数的补码即自身)。

示例(8 位无符号数):5 - 10

等价于 5 + (256 - 10) = 5 + 246 = 251(因 8 位无符号数的模为 256),结果为 251(正确,无符号数减法的 “借位” 通过模运算处理)。

总结

编码

加法规则

减法规则

核心特点

原码

符号位单独处理,异号需比较绝对值

转化为 “被减数 + 相反数”,同加法

逻辑复杂,有双 0,几乎不用

反码

符号位参与运算,进位循环到最低位

转化为 “被减数 + 减数的反码”

需循环进位,仍有 - 0,过渡编码

补码

符号位参与运算,进位直接丢弃

转化为 “被减数 + 减数的补码”

逻辑简单,无歧义,计算机实际使用

补码的运算规则是 C 语言中整数存储和运算的基础,理解其规则可解释负数运算、溢出(如int a = 127 + 1结果为 - 128)等现象。

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

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

相关文章

js二维数组如何变为一维数组

在 JavaScript 中,将二维数组转换为一维数组(扁平化)有多种方法,可根据数组结构复杂度、性能需求和兼容性选择。以下是最常用的实现方式: 1. 使用 flat() 方法(ES2019) MDN释义:flat…

Claude code在Windows上的配置流程

前言 昨天在服务器上配置好了 Claude code,发现其编码性能和效率都非常不错。 然而,尝试用它修改带 UI 界面的客户端程序时颇为不便,因为服务器没有图形化界面,无法直接将应用界面直接显示到开发机上,调试起来颇为不…

手把手教你用YOLOv10打造智能垃圾检测系统

无需编程基础!手把手教你用YOLOv10打造智能垃圾检测系统 垃圾分类不再难,AI助手秒识别 你是否曾站在分类垃圾桶前犹豫不决?塑料瓶是可回收还是其他垃圾?外卖餐盒到底该丢哪里?随着垃圾分类政策推广,这样的困…

batchnorm类

1. 伪代码:2. python代码:3. 测试:4. 加深理解:以 为例,x3,可见输出的batchnorm后y0.2627.查看模型记录的均值及方差,计算y0.286799,理解是大致这样的计算过程。(为什么数…

SpringBoot项目保证接口幂等的五种方法!

1. 幂等概述 1.1 深入理解幂等性 在计算机领域中,幂等(Idempotence)是指任意一个操作的多次执行总是能获得相同的结果,不会对系统状态产生额外影响。在Java后端开发中,幂等性的实现通常通过确保方法或服务调用的结果…

SQL新手入门详细教程和应用实例

SQL(Structured Query Language)是用于管理和操作关系型数据库的标准语言。它允许你创建、查询、更新和删除数据。本教程将从基础概念开始,逐步引导你上手SQL,并提供详细的应用实例。教程基于标准SQL语法,实际使用时需根据数据库系统(如MySQL、SQLite或PostgreSQL)调整。…

DVWA-LOW级-SQL手工注入漏洞测试(MySQL数据库)+sqlmap自动化注入-小白必看(超详细)

首次使用DVWA的靶场,咋们先从最低级别的LOW开始,因为之前玩过一下墨者学院,对sql注入有一点认识和理解,所以先从sql的盲注开始; 1、测试注入点是否存在sql注入的漏洞; (1)首先我们…

JAVA线程池详解+学习笔记

1.线程池基础概念线程池是一种资源复用技术,通过预先创建并管理一组线程,减少频繁创建和销毁线程的开销。核心思想与数据库连接池、字符串常量池类似,旨在提升系统性能。核心参数解析ThreadPoolExecutor构造函数包含7个关键参数:c…

数据分析库 Pandas

对于Pandas的简单认识和基本操作的练习一 介绍 Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的库。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于 Excel …

qt 中不要让 lambda 槽函数捕获信号源对象的共享指针

错误示例std::shared_ptr<QSerialPort> serial{new QSerialPort{}};QSerialPort::connect(serial.get(),&QSerialPort::readyRead,[serial](){QByteArray receive_data serial->readAll();std::cout.write(receive_data.data(), receive_data.size());});这会直接…

Solidity 合约的编写-完整开发流程:从编译、测试、部署到交互

&#x1f9f1; Solidity 合约开发全流程&#xff08;Foundry 版&#xff09;✅ 适合对象&#xff1a;已经能写合约但不清楚如何测试、部署、交互的开发者✅ 工具链&#xff1a;Foundry&#xff08;forge, anvil, cast&#xff09;&#x1f4cc; 开发流程总览1️⃣ 初始化项目 2…

设计模式 - 面向对象原则:SOLID最佳实践

文章目录深入理解 SOLID&#xff1a;用对原则&#xff0c;别把简单问题搞复杂SOLID 原则概览1. 单一职责原则&#xff08;SRP&#xff09;2. 开闭原则&#xff08;OCP&#xff09;3. 里氏替换原则&#xff08;LSP&#xff09;4. 接口隔离原则&#xff08;ISP&#xff09;5. 依赖…

Vue 3 中父组件内两个子组件相互传参的几种方法

方法一&#xff1a;通过父组件中转&#xff08;Props Emits&#xff09;<!-- ParentComponent.vue --> <template><ChildA :message-from-b"messageFromB" send-to-b"handleSendToB" /><ChildB :message-from-a"messageFromA&q…

三子棋游戏设计与实现(C 语言版)

一、需求分析目标&#xff1a;实现一个简单的人机对战三子棋&#xff0c;支持以下功能&#xff1a;初始化空棋盘&#xff0c;清晰展示落子状态。玩家通过坐标落子&#xff08;X 代表玩家&#xff09;&#xff0c;电脑随机落子&#xff08;O 代表电脑&#xff09;。实时判断胜负…

GD32 CAN1和TIMER0同时开启问题

背景&#xff1a;今天在一个项目调试的时候发现了一些问题&#xff0c;由此贴记录一下问题解决的过程。使用的芯片是GD32F305VE。使用到了CAN1和TIMER0。在使用这连个外设的时候发送了一些问题。单独使用CAN1。功能正常。单独使用TIMER0。配置为输出模式。功能正常。但是当两个…

剑指offer56_数组中唯一只出现一次的数字

数组中唯一只出现一次的数字在一个数组中除了一个数字只出现一次之外&#xff0c;其他数字都出现了三次。 请找出那个只出现一次的数字。 你可以假设满足条件的数字一定存在。 思考题&#xff1a; 如果要求只使用 O(n) 的时间和额外 O(1) 的空间&#xff0c;该怎么做呢&#xf…

从语音识别到智能助手:Voice Agent 的技术进化与交互变革丨Voice Agent 学习笔记

From Research AI&#xff1a; 最近看到 Andrew Ng 的一句话让我印象深刻&#xff1a;“While some things in AI are overhyped, voice applications seem underhyped right now.”&#xff08;尽管 AI 中有些领域被过度炒作&#xff0c;语音应用却似乎被低估了&#xff09;。…

什么是Jaccard 相似度(Jaccard Similarity)

文章目录✅ 定义&#xff1a;&#x1f4cc; 取值范围&#xff1a;&#x1f50d; 举例说明&#xff1a;&#x1f9e0; 应用场景&#xff1a;⚠️ 局限性&#xff1a;&#x1f4a1; 扩展概念&#xff1a;Jaccard 相似度&#xff08;Jaccard Similarity&#xff09; 是一种用于衡量…

ragflow_多模态文档解析与正文提取策略

多模态文档解析与正文提取策略 RAGflow的文档解析系统位于deepdoc/parser/目录下,实现了对多种文档格式的统一解析处理。该系统采用模块化设计,针对不同文档格式提供专门的解析器,并通过视觉识别技术增强解析能力。本文将深入探讨RAGflow的文档解析系统的设计原理、实现细节…

数据结构栈的实现(C语言)

栈的基本概念栈是一种特殊的线性存储结构&#xff0c;是一种操作受到限制的线性表&#xff0c;特殊体现在两个地方&#xff1a;1、元素进栈出栈的操作只能从同一端完成&#xff0c;另一端是封闭的&#xff0c;通常将数据进栈叫做入栈&#xff0c;压栈等&#xff0c;出栈叫做弹栈…