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

【C语言】原码、反码、补码详解 -《码上有道 ! 》

目录

  • 原码、反码、补码详解及其在C语言中的应用
    • 一、原码(Sign-Magnitude)
      • 1.1 定义与表示
      • 1.2 历史来源与作用
      • 1.3 示例
      • 1.4 C语言示例
      • 1.5 代码运行结果
    • 二、反码(One's Complement)
      • 2.1 定义与表示
      • 2.2 历史来源与作用
      • 2.3 示例
      • 2.4 C语言示例
      • 2.5 代码运行结果
    • 三、补码(Two's Complement)
      • 3.1 定义与表示
      • 3.2 历史来源与作用
      • 3.3 示例
      • 3.4 C语言示例
      • 3.5 代码运行结果
    • 四、原码、反码、补码之间的关系
    • 五、总结
    • 六、参考文献
    • 七、结束语

原码、反码、补码详解及其在C语言中的应用

在计算机科学中,整数的表示方式有多种,包括原码、反码和补码。这些表示方式主要用于解决整数的二进制表示和计算问题。本文将详细介绍这三种表示方法,并通过示例来说明它们的原理和应用,特别是它们在C语言中的应用。

一、原码(Sign-Magnitude)

1.1 定义与表示

原码是一种最直接的二进制表示法,其中最高位(最左边的一位)表示符号位,其他位表示数值大小。

  • 符号位:0 表示正数,1 表示负数。
  • 数值位:直接使用二进制表示数值大小。

1.2 历史来源与作用

原码在早期计算机中被广泛使用,因为其简单直观的表示方式便于理解和实现。然而,由于在处理正负数运算时需要单独处理符号位,导致计算复杂,逐渐被反码和补码取代。

1.3 示例

十进制原码表示
50000 0101
-51000 0101

说明

  • 0000 0101 表示正数 5。
  • 1000 0101 表示负数 -5。

1.4 C语言示例

在C语言中,没有直接操作原码的方式,但可以通过位操作实现对符号位和数值位的处理。

#include <stdio.h>void printBinary(int num) {for (int i = 7; i >= 0; i--) {printf("%d", (num >> i) & 1);}printf("\n");
}int main() {int num = 5;int neg_num = -5;printf("原码表示:\n");printf("5 的二进制表示: ");printBinary(num);printf("-5 的二进制表示: ");printBinary((1 << 7) | num);  // 手动构造原码表示return 0;
}

1.5 代码运行结果

原码表示:
5 的二进制表示: 00000101
-5 的二进制表示: 10000101

二、反码(One’s Complement)

2.1 定义与表示

反码是将原码的数值位按位取反(0 变 1,1 变 0)得到的。

  • 正数的反码:与其原码相同。
  • 负数的反码:将其原码的数值位取反,符号位不变。

2.2 历史来源与作用

反码的引入是为了解决原码在进行加减运算时的符号位问题。通过按位取反,可以简化计算机中负数的表示和运算。然而,反码存在两个零(正零 0000 0000 和负零 1111 1111),计算不便,最终被补码取代。

2.3 示例

十进制原码表示反码表示
50000 01010000 0101
-51000 01011111 1010

说明

  • 正数 5 的反码与其原码相同。
  • 负数 -5 的反码是 1111 1010,其中 0000 0101 的每个位取反得到 1111 1010

2.4 C语言示例

在C语言中,可以通过位操作计算反码。

#include <stdio.h>void printBinary(int num) {for (int i = 7; i >= 0; i--) {printf("%d", (num >> i) & 1);}printf("\n");
}int main() {int num = 5;int neg_num = -5;printf("反码表示:\n");printf("5 的二进制表示: ");printBinary(num);printf("-5 的反码表示: ");printBinary(~num);  // 按位取反得到反码return 0;
}

2.5 代码运行结果

反码表示:
5 的二进制表示: 00000101
-5 的反码表示: 11111010

三、补码(Two’s Complement)

3.1 定义与表示

补码是目前计算机系统中广泛使用的一种二进制表示法,解决了原码和反码的缺点。

  • 正数的补码:与其原码相同。
  • 负数的补码:在其反码的基础上加 1。

3.2 历史来源与作用

补码的引入是为了统一零的表示(只有一个零 0000 0000)并简化计算。补码使得正数和负数的加减运算可以使用同一套电路,避免了符号位单独处理的问题,极大地提高了计算效率。由于这些优点,补码成为现代计算机系统中普遍使用的整数表示方法。

3.3 示例

十进制原码表示反码表示补码表示
50000 01010000 01010000 0101
-51000 01011111 10101111 1011

说明

  • 正数 5 的补码与其原码相同。
  • 负数 -5 的补码是 1111 1011,在反码 1111 1010 的基础上加 1 得到 1111 1011

3.4 C语言示例

在C语言中,负数的补码表示可以通过标准的负数表示方式得到。

#include <stdio.h>void printBinary(int num) {for (int i = 7; i >= 0; i--) {printf("%d", (num >> i) & 1);}printf("\n");
}int main() {int num = 5;int neg_num = -5;printf("补码表示:\n");printf("5 的二进制表示: ");printBinary(num);printf("-5 的补码表示: ");printBinary(neg_num);return 0;
}

3.5 代码运行结果

补码表示:
5 的二进制表示: 00000101
-5 的补码表示: 11111011

四、原码、反码、补码之间的关系

十进制原码反码补码
50000 01010000 01010000 0101
-51000 01011111 10101111 1011
  • 正数:原码、反码、补码相同。
  • 负数:反码是原码数值位取反,补码是反码加 1。

五、总结

表示法特点应用
原码简单直观,计算复杂较少应用
反码解决符号位问题,存在两个零较少应用
补码统一了零的表示,简化了计算,适合二进制运算现代计算机系统广泛使用

补码的优点使得它成为现代计算机系统中普遍使用的整数表示方法。了解原码、反码和补码之间的关系和转换方法,对于理解计算机底层运算和处理负数具有重要意义。在C语言中,理解这些表示方法有助于更好地处理整数运算和位操作。

六、参考文献

  1. Kernighan, B. W., & Ritchie, D. M. (1988). The C Programming Language (2nd ed.). Prentice Hall.
  2. Andrew S. Tanenbaum. “Structured Computer Organization.” 6th Edition. Pearson, 2013.
  3. ISO/IEC. (2024). ISO/IEC DIS 9899. Programming Languages – C.
  4. Donald E. Knuth. “The Art of Computer Programming, Volume 2: Seminumerical Algorithms.” 3rd Edition. Addison-Wesley, 1997.

七、结束语

  1. 本节内容已经全部介绍完毕,希望通过这篇文章,大家对原码、反码、补码有了更深入的理解和认识。
  2. 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持

相关文章:

【C语言】原码、反码、补码详解 -《码上有道 ! 》

目录 原码、反码、补码详解及其在C语言中的应用一、原码&#xff08;Sign-Magnitude&#xff09;1.1 定义与表示1.2 历史来源与作用1.3 示例1.4 C语言示例1.5 代码运行结果 二、反码&#xff08;Ones Complement&#xff09;2.1 定义与表示2.2 历史来源与作用2.3 示例2.4 C语言…...

C++找到错误的具体信息

fprintf(stderr, "Errno: %d, Error message: %s\n", errno, strerror(errno));为什么不用printf来打印输出&#xff1f; 使用 fprintf(stderr, …)&#xff0c;将错误消息输出到标准错误流 stderr。这种做法是为了将错误信息输出到一个专门用于记录错误的流中&…...

Windows 安装Zookeeper

安装 下载地址&#xff1a;Apache ZooKeeper 我下载的版本&#xff1a;zookeeper-3.4.12 下载后&#xff0c;解压 配置 1、 在D:\zookeeper-3.4.12文件夹中创建一个“data”文件夹和“log”文件夹 2、 复制zoo_sample.cfg&#xff0c;改名&#xff1a;zoo.cfg 修改zoo.c…...

从人工巡检到智能预警:视频AI智能监控技术在水库/河湖/水利防汛抗洪中的应用

一、背景需求分析 近日&#xff0c;我国多省市遭遇连日暴雨&#xff0c;导致水库、湖泊、河道等水域水位暴涨&#xff0c;城市内涝频发。随着夏季汛期的到来&#xff0c;降雨天气频繁&#xff0c;水利安全管理面临严峻挑战。为保障水库安全、预防和减少洪涝灾害&#xff0c;采…...

【轻松拿捏 】Java-static关键字(面试)

Java-static关键字 1. 定义和基本概念 回答要点&#xff1a; 示例回答&#xff1a; 2. static 变量 回答要点&#xff1a; 示例回答&#xff1a; 代码示例&#xff1a; 3. static方法 回答要点&#xff1a; 示例回答&#xff1a; 代码示例&#xff1a; 4. static 代…...

【阶乘】个人练习-Leetcode-LCP 22. 黑白方格画

题目链接&#xff1a;https://leetcode.cn/problems/ccw6C7/description/ 题目大意&#xff1a;给出一块白方格面积为n*n&#xff0c;给出一个数字k&#xff0c;每一次操作可以把方格的某一整行或者某一整列涂黑&#xff0c;求使得黑色格子数字为k的【最终图案】的个数。 思路…...

十七、【文本编辑器(三)】图像坐标变换

目录 一、缩放功能 二、旋转功能 三、镜像功能 四、QMatrix简单介绍 一、缩放功能 &#xff08;1&#xff09;在头文件中添加 “protected slots:" 变量&#xff1a; void ShowZoomln( ); &#xff08;2&#xff09;在 createActionso函数的最后添力口事件关联&…...

生活中生智慧

【 圣人多过 小人无过 】 觉得自己做得不够才能做得更好&#xff0c;互相成全&#xff1b;反求诸己是致良知的第一步&#xff1b;有苦难才能超越自己&#xff0c;开胸怀和智慧&#xff1b;不浪费任何一次困苦&#xff0c;危机中寻找智慧&#xff0c;成长自己。 把困苦当作当下…...

2024第18届中国西部(成都)教育装备展12月14日举办

2025中国国际工业气体设备技术及应用展览会 2025 China International Industrial Gas Equipment Technology and Application Exhibition 时间&#xff1a;2025年3月18-20日 地点&#xff1a;北京全国农业展览馆&#xff08;新馆&#xff09; 展览前言 随着需求市场的持续…...

Webpack看这篇就够了

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...

基于京东电商蓝牙耳机产品评论数据的情感分析与文本分析

摘要 随着电子商务的迅速发展&#xff0c;了解用户对产品的意见和情感倾向对企业至关重要。本研究旨在利用Python大数据技术对电商产品评论进行情感分析和主题建模&#xff0c;为企业提供有价值的市场洞察。 通过爬虫获取电商评论数据&#xff0c;使用pandas清洗和预处理数据&a…...

【Linux网络】poll{初识poll / poll接口 / poll vs select / poll开发多客户端echo服务器}

文章目录 1.初识pollpoll与select的主要联系与区别poll的原理poll的优点poll的缺点poll vs select 2.poll开发多客户端echo服务器封装套接字接口Makefile主函数日志服务聊天服务器 1.初识poll poll是Linux系统中的一个系统调用&#xff0c;它用于监控多个文件描述符&#xff08…...

数据库db文件损坏修复方法(sqlite3:database disk image is malformed)

参考博客&#xff1a; https://www.cnblogs.com/liuyangQAQ/p/18037546 sqlite3数据库提示database disk image is malformed 解决办法-CSDN博客 【SQL】sqlite数据库损坏报错&#xff1a;database disk image is malformed&#xff08;已解决&#xff09;-CSDN博客 一、第…...

Prometheus 云原生 - 微服务监控报警系统 (Promethus、Grafana、Node_Exporter)部署、简单使用

目录 开始 Prometheus 介绍 基本原理 组件介绍 下文部署组件的工作方式 Prometheus 生态安装&#xff08;Mac&#xff09; 安装 prometheus 安装 grafana 安装 node_exporter Prometheus 生态安装&#xff08;Docker&#xff09; 安装 prometheus 安装 Grafana 安装…...

Spring源码注解篇三:深入理解@Component注解

Component及其派生注解的源码 Spring框架作为Java开发中不可或缺的一部分&#xff0c;其依赖注入机制的核心是通过注解来实现的。本文将深入探讨Spring中Component及其派生注解的源码实现&#xff0c;分析Spring如何通过类路径扫描&#xff08;Classpath Scanning&#xff09;和…...

SpringBoot中常用的注解及其用法

1. 常用类注解 RestController和Controller是Spring中用于定义控制器的两个类注解. 1.1 RestController RestController是一个组合类注解,是Controller和ResponseBody两个注解的组合,在使 用 RestController 注解标记的类中&#xff0c;每个方法的返回值都会以 JSON 或 XML…...

【大语言模型】私有化搭建-企业知识库-知识问答系统

下面是我关于大语言模型学习的一点记录 目录 人工智能学习路线 MaxKB 系统(基于大语言模型的知识问答系统) 部署开源大语言模型LLM 1.CPU模式(没有好的GPU&#xff0c;算力和效果较差) 2.GPU模式&#xff08;需要有NVIDIA显卡支持&#xff09; Ollama网络配置 Ollama前…...

CSS常用的样式

字体和文本样式 font-family: 定义文本字体。 font-size: 设置字体大小。 color: 设置文本颜色。 text-align: 水平对齐文本&#xff08;左对齐、右对齐、居中、两端对齐&#xff09;。 line-height: 设置行间距。 text-decoration: 控制文本装饰线&#xff08;如下划线、…...

结合实体类型信息(2)——基于本体的知识图谱补全深度学习方法

1 引言 1.1 问题 目前KGC和KGE提案的两个主要缺点是:(1)它们没有利用本体信息;(二)对训练时未见的事实和新鲜事物不能预测的。 1.2 解决方案 一种新的知识图嵌入初始化方法。 1.3 结合的信息 知识库中的实体向量表示&#xff0b;编码后的本体信息——>增强 KGC 2基…...

如何在电脑上演示手机上APP,远程排查移动端app问题

0序&#xff1a; 对接客户&#xff0c;给领导演示移动端产品&#xff0c;或者远程帮用户排查移动端产品的问题。都需要让别人能够看到自己在操作手机。 会议室可以使用投屏&#xff0c;但需要切换电脑和手机。 排查问题经常都是截图、或者手机上录制视频&#xff0c;十分繁琐…...

文字识别OCR 在线工具 vs OCR API 接口平台:普通用户和开发者该怎么选?

随着 AI 发展&#xff0c;OCR 已经成了办公、学习、开发必备工具。 但现在市面上的 OCR 工具大致分两类&#xff1a; 在线 OCR 网站&#xff08;网页直接用&#xff09; OCR API 接口平台&#xff08;系统对接用&#xff09; 很多人不知道该怎么选&#xff0c;我从【普通用…...

谷歌发布Gemma 4模型,为低功耗设备带来复杂推理能力

谷歌发布了其最先进的开放权重人工智能模型家族Gemma 4&#xff0c;这标志着开放权重AI模型领域的重大进步。技术架构与性能突破Gemma 4基于与Gemini 3相同的架构基础构建&#xff0c;专门设计用于处理复杂推理任务&#xff0c;并支持在工作站和智能手机等低功耗设备上本地运行…...

多元化团队从多元化投资机构开始

初创企业往往口头上重视多元化&#xff0c;但在实际招聘实践中却行动缓慢。对于成长阶段的公司来说&#xff0c;从熟悉的硅谷人才渠道招聘是阻力最小的路径&#xff0c;但如果创始人想要一个多元化的团队&#xff0c;就必须从第一个员工开始将这一价值观付诸实践。Taskrabbit创…...

ISO-SLAM-seq:全长 RNA代谢测序服务

ISO-SLAM-seq 技术&#xff0c;是 SLAM-seq 与 ISO-seq 的结合&#xff0c;通过研发成熟的核苷类似物 4-硫尿苷 (S4U) 代谢 RNA 标记方法和基于 Oxford Nanopore Technology 纳米孔测序平台或者 PacBio 的三代全长转录组测序方法&#xff0c;ISO-SLAM-seq 能检测整合到总 RNA 中…...

WaveTools:解决鸣潮玩家性能优化与数据管理痛点的开源工具

WaveTools&#xff1a;解决鸣潮玩家性能优化与数据管理痛点的开源工具 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools是一款专为《鸣潮》PC玩家设计的开源辅助工具&#xff0c;集成性能优化、账…...

SEO_中小企业如何低成本做好SEO?实用方案分享

为什么中小企业需要关注SEO 在当今数字化经济时代&#xff0c;中小企业如果想要在竞争激烈的市场中脱颖而出&#xff0c;关注SEO&#xff08;搜索引擎优化&#xff09;是必不可少的。SEO不仅能够提升网站的搜索引擎排名&#xff0c;还能有效带来更多的潜在客户。许多中小企业在…...

PADS VX2.8 极坐标布局技巧:圆形灯板LED高效排列指南

1. 极坐标布局在圆形灯板设计中的核心价值 第一次接触圆形LED灯板设计时&#xff0c;我被密密麻麻的元件排列搞得头晕眼花。传统直角坐标系下&#xff0c;要精确控制每个LED灯珠的间距和角度&#xff0c;需要反复计算XY坐标&#xff0c;效率极低。直到发现PADS VX2.8的极坐标功…...

3D点云检测实战指南-数据准备篇(一):Nuscenes数据集解析与应用

1. Nuscenes数据集基础解析 第一次接触Nuscenes数据集时&#xff0c;我被它庞大的数据量和精细的标注震撼到了。这个由Motional团队打造的自动驾驶数据集&#xff0c;包含了1000个真实驾驶场景&#xff0c;每个场景持续20秒。不同于普通数据集&#xff0c;Nuscenes最吸引我的是…...

【Hot 100 刷题计划】 LeetCode 128. 最长连续序列 | C++ 哈希表 O(N) 题解

LeetCode 128. 最长连续序列 | C Set 与哈希表 O(N) 双解法题解 &#x1f4cc; 题目描述 题目级别&#xff1a;中等 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度…...

安规标准考核题库-1(IEC 62477-1:2012+AMD1:2022 )

本题库严格对标 IEC 62477-1:2012《电力电子变换器系统和设备安全要求 第 1 部分&#xff1a;总则》AMD1:2022 修订版&#xff0c;贴合储能双向 PCS 的设计、测试、认证全流程场景&#xff0c;分为判断题、单选题、多选题三类&#xff0c;所有题目均附标准条款依据与详细解答。…...