【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 示例
| 十进制 | 原码表示 |
|---|---|
| 5 | 0000 0101 |
| -5 | 1000 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 示例
| 十进制 | 原码表示 | 反码表示 |
|---|---|---|
| 5 | 0000 0101 | 0000 0101 |
| -5 | 1000 0101 | 1111 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 示例
| 十进制 | 原码表示 | 反码表示 | 补码表示 |
|---|---|---|---|
| 5 | 0000 0101 | 0000 0101 | 0000 0101 |
| -5 | 1000 0101 | 1111 1010 | 1111 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
四、原码、反码、补码之间的关系
| 十进制 | 原码 | 反码 | 补码 |
|---|---|---|---|
| 5 | 0000 0101 | 0000 0101 | 0000 0101 |
| -5 | 1000 0101 | 1111 1010 | 1111 1011 |
- 正数:原码、反码、补码相同。
- 负数:反码是原码数值位取反,补码是反码加 1。
五、总结
| 表示法 | 特点 | 应用 |
|---|---|---|
| 原码 | 简单直观,计算复杂 | 较少应用 |
| 反码 | 解决符号位问题,存在两个零 | 较少应用 |
| 补码 | 统一了零的表示,简化了计算,适合二进制运算 | 现代计算机系统广泛使用 |
补码的优点使得它成为现代计算机系统中普遍使用的整数表示方法。了解原码、反码和补码之间的关系和转换方法,对于理解计算机底层运算和处理负数具有重要意义。在C语言中,理解这些表示方法有助于更好地处理整数运算和位操作。
六、参考文献
- Kernighan, B. W., & Ritchie, D. M. (1988). The C Programming Language (2nd ed.). Prentice Hall.
- Andrew S. Tanenbaum. “Structured Computer Organization.” 6th Edition. Pearson, 2013.
- ISO/IEC. (2024). ISO/IEC DIS 9899. Programming Languages – C.
- Donald E. Knuth. “The Art of Computer Programming, Volume 2: Seminumerical Algorithms.” 3rd Edition. Addison-Wesley, 1997.
七、结束语
- 本节内容已经全部介绍完毕,希望通过这篇文章,大家对原码、反码、补码有了更深入的理解和认识。
- 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持!
相关文章:
【C语言】原码、反码、补码详解 -《码上有道 ! 》
目录 原码、反码、补码详解及其在C语言中的应用一、原码(Sign-Magnitude)1.1 定义与表示1.2 历史来源与作用1.3 示例1.4 C语言示例1.5 代码运行结果 二、反码(Ones Complement)2.1 定义与表示2.2 历史来源与作用2.3 示例2.4 C语言…...
C++找到错误的具体信息
fprintf(stderr, "Errno: %d, Error message: %s\n", errno, strerror(errno));为什么不用printf来打印输出? 使用 fprintf(stderr, …),将错误消息输出到标准错误流 stderr。这种做法是为了将错误信息输出到一个专门用于记录错误的流中&…...
Windows 安装Zookeeper
安装 下载地址:Apache ZooKeeper 我下载的版本:zookeeper-3.4.12 下载后,解压 配置 1、 在D:\zookeeper-3.4.12文件夹中创建一个“data”文件夹和“log”文件夹 2、 复制zoo_sample.cfg,改名:zoo.cfg 修改zoo.c…...
从人工巡检到智能预警:视频AI智能监控技术在水库/河湖/水利防汛抗洪中的应用
一、背景需求分析 近日,我国多省市遭遇连日暴雨,导致水库、湖泊、河道等水域水位暴涨,城市内涝频发。随着夏季汛期的到来,降雨天气频繁,水利安全管理面临严峻挑战。为保障水库安全、预防和减少洪涝灾害,采…...
【轻松拿捏 】Java-static关键字(面试)
Java-static关键字 1. 定义和基本概念 回答要点: 示例回答: 2. static 变量 回答要点: 示例回答: 代码示例: 3. static方法 回答要点: 示例回答: 代码示例: 4. static 代…...
【阶乘】个人练习-Leetcode-LCP 22. 黑白方格画
题目链接:https://leetcode.cn/problems/ccw6C7/description/ 题目大意:给出一块白方格面积为n*n,给出一个数字k,每一次操作可以把方格的某一整行或者某一整列涂黑,求使得黑色格子数字为k的【最终图案】的个数。 思路…...
十七、【文本编辑器(三)】图像坐标变换
目录 一、缩放功能 二、旋转功能 三、镜像功能 四、QMatrix简单介绍 一、缩放功能 (1)在头文件中添加 “protected slots:" 变量: void ShowZoomln( ); (2)在 createActionso函数的最后添力口事件关联&…...
生活中生智慧
【 圣人多过 小人无过 】 觉得自己做得不够才能做得更好,互相成全;反求诸己是致良知的第一步;有苦难才能超越自己,开胸怀和智慧;不浪费任何一次困苦,危机中寻找智慧,成长自己。 把困苦当作当下…...
2024第18届中国西部(成都)教育装备展12月14日举办
2025中国国际工业气体设备技术及应用展览会 2025 China International Industrial Gas Equipment Technology and Application Exhibition 时间:2025年3月18-20日 地点:北京全国农业展览馆(新馆) 展览前言 随着需求市场的持续…...
Webpack看这篇就够了
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...
基于京东电商蓝牙耳机产品评论数据的情感分析与文本分析
摘要 随着电子商务的迅速发展,了解用户对产品的意见和情感倾向对企业至关重要。本研究旨在利用Python大数据技术对电商产品评论进行情感分析和主题建模,为企业提供有价值的市场洞察。 通过爬虫获取电商评论数据,使用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系统中的一个系统调用,它用于监控多个文件描述符(…...
数据库db文件损坏修复方法(sqlite3:database disk image is malformed)
参考博客: https://www.cnblogs.com/liuyangQAQ/p/18037546 sqlite3数据库提示database disk image is malformed 解决办法-CSDN博客 【SQL】sqlite数据库损坏报错:database disk image is malformed(已解决)-CSDN博客 一、第…...
Prometheus 云原生 - 微服务监控报警系统 (Promethus、Grafana、Node_Exporter)部署、简单使用
目录 开始 Prometheus 介绍 基本原理 组件介绍 下文部署组件的工作方式 Prometheus 生态安装(Mac) 安装 prometheus 安装 grafana 安装 node_exporter Prometheus 生态安装(Docker) 安装 prometheus 安装 Grafana 安装…...
Spring源码注解篇三:深入理解@Component注解
Component及其派生注解的源码 Spring框架作为Java开发中不可或缺的一部分,其依赖注入机制的核心是通过注解来实现的。本文将深入探讨Spring中Component及其派生注解的源码实现,分析Spring如何通过类路径扫描(Classpath Scanning)和…...
SpringBoot中常用的注解及其用法
1. 常用类注解 RestController和Controller是Spring中用于定义控制器的两个类注解. 1.1 RestController RestController是一个组合类注解,是Controller和ResponseBody两个注解的组合,在使 用 RestController 注解标记的类中,每个方法的返回值都会以 JSON 或 XML…...
【大语言模型】私有化搭建-企业知识库-知识问答系统
下面是我关于大语言模型学习的一点记录 目录 人工智能学习路线 MaxKB 系统(基于大语言模型的知识问答系统) 部署开源大语言模型LLM 1.CPU模式(没有好的GPU,算力和效果较差) 2.GPU模式(需要有NVIDIA显卡支持) Ollama网络配置 Ollama前…...
CSS常用的样式
字体和文本样式 font-family: 定义文本字体。 font-size: 设置字体大小。 color: 设置文本颜色。 text-align: 水平对齐文本(左对齐、右对齐、居中、两端对齐)。 line-height: 设置行间距。 text-decoration: 控制文本装饰线(如下划线、…...
结合实体类型信息(2)——基于本体的知识图谱补全深度学习方法
1 引言 1.1 问题 目前KGC和KGE提案的两个主要缺点是:(1)它们没有利用本体信息;(二)对训练时未见的事实和新鲜事物不能预测的。 1.2 解决方案 一种新的知识图嵌入初始化方法。 1.3 结合的信息 知识库中的实体向量表示+编码后的本体信息——>增强 KGC 2基…...
如何在电脑上演示手机上APP,远程排查移动端app问题
0序: 对接客户,给领导演示移动端产品,或者远程帮用户排查移动端产品的问题。都需要让别人能够看到自己在操作手机。 会议室可以使用投屏,但需要切换电脑和手机。 排查问题经常都是截图、或者手机上录制视频,十分繁琐…...
文字识别OCR 在线工具 vs OCR API 接口平台:普通用户和开发者该怎么选?
随着 AI 发展,OCR 已经成了办公、学习、开发必备工具。 但现在市面上的 OCR 工具大致分两类: 在线 OCR 网站(网页直接用) OCR API 接口平台(系统对接用) 很多人不知道该怎么选,我从【普通用…...
谷歌发布Gemma 4模型,为低功耗设备带来复杂推理能力
谷歌发布了其最先进的开放权重人工智能模型家族Gemma 4,这标志着开放权重AI模型领域的重大进步。技术架构与性能突破Gemma 4基于与Gemini 3相同的架构基础构建,专门设计用于处理复杂推理任务,并支持在工作站和智能手机等低功耗设备上本地运行…...
多元化团队从多元化投资机构开始
初创企业往往口头上重视多元化,但在实际招聘实践中却行动缓慢。对于成长阶段的公司来说,从熟悉的硅谷人才渠道招聘是阻力最小的路径,但如果创始人想要一个多元化的团队,就必须从第一个员工开始将这一价值观付诸实践。Taskrabbit创…...
ISO-SLAM-seq:全长 RNA代谢测序服务
ISO-SLAM-seq 技术,是 SLAM-seq 与 ISO-seq 的结合,通过研发成熟的核苷类似物 4-硫尿苷 (S4U) 代谢 RNA 标记方法和基于 Oxford Nanopore Technology 纳米孔测序平台或者 PacBio 的三代全长转录组测序方法,ISO-SLAM-seq 能检测整合到总 RNA 中…...
WaveTools:解决鸣潮玩家性能优化与数据管理痛点的开源工具
WaveTools:解决鸣潮玩家性能优化与数据管理痛点的开源工具 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools是一款专为《鸣潮》PC玩家设计的开源辅助工具,集成性能优化、账…...
SEO_中小企业如何低成本做好SEO?实用方案分享
为什么中小企业需要关注SEO 在当今数字化经济时代,中小企业如果想要在竞争激烈的市场中脱颖而出,关注SEO(搜索引擎优化)是必不可少的。SEO不仅能够提升网站的搜索引擎排名,还能有效带来更多的潜在客户。许多中小企业在…...
PADS VX2.8 极坐标布局技巧:圆形灯板LED高效排列指南
1. 极坐标布局在圆形灯板设计中的核心价值 第一次接触圆形LED灯板设计时,我被密密麻麻的元件排列搞得头晕眼花。传统直角坐标系下,要精确控制每个LED灯珠的间距和角度,需要反复计算XY坐标,效率极低。直到发现PADS VX2.8的极坐标功…...
3D点云检测实战指南-数据准备篇(一):Nuscenes数据集解析与应用
1. Nuscenes数据集基础解析 第一次接触Nuscenes数据集时,我被它庞大的数据量和精细的标注震撼到了。这个由Motional团队打造的自动驾驶数据集,包含了1000个真实驾驶场景,每个场景持续20秒。不同于普通数据集,Nuscenes最吸引我的是…...
【Hot 100 刷题计划】 LeetCode 128. 最长连续序列 | C++ 哈希表 O(N) 题解
LeetCode 128. 最长连续序列 | C Set 与哈希表 O(N) 双解法题解 📌 题目描述 题目级别:中等 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度…...
安规标准考核题库-1(IEC 62477-1:2012+AMD1:2022 )
本题库严格对标 IEC 62477-1:2012《电力电子变换器系统和设备安全要求 第 1 部分:总则》AMD1:2022 修订版,贴合储能双向 PCS 的设计、测试、认证全流程场景,分为判断题、单选题、多选题三类,所有题目均附标准条款依据与详细解答。…...
