【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序: 对接客户,给领导演示移动端产品,或者远程帮用户排查移动端产品的问题。都需要让别人能够看到自己在操作手机。 会议室可以使用投屏,但需要切换电脑和手机。 排查问题经常都是截图、或者手机上录制视频,十分繁琐…...
终极指南:3分钟掌握英雄联盟智能助手League Akari的完整使用技巧 [特殊字符]
终极指南:3分钟掌握英雄联盟智能助手League Akari的完整使用技巧 🚀 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 想…...
G3000,MG3660,MG3640S,TS3380,G3800,TS3480,TS3680,TS3460,TS3350,MG6380报错5B00,P07,E08,1700,5b04废墨垫清零,好用
下载:点这里下载 备用下载:https://pan.baidu.com/s/1WrPFvdV8sq-qI3_NgO2EvA?pwd0000 常见型号如下: G系列 G1000、G1100、G1200、G1400、G1500、G1800、G1900、G1010、G1110、G1120、G1410、G1420、G1411、G1510、G1520、G1810、G1820、…...
避坑指南:在Ubuntu 20.04上配置VNC远程桌面,为什么我推荐UltraVNC Viewer而不是TigerVNC?
Ubuntu 20.04远程桌面配置:为什么UltraVNC Viewer成为技术中坚的首选? 在Linux桌面环境远程管理的世界里,VNC协议就像一位历经沧桑的老兵,依然活跃在企业运维、远程开发和混合办公的第一线。Ubuntu 20.04 LTS作为长期支持版本&…...
Raw Accel深度解析:从零掌握Windows内核级鼠标加速的终极指南
Raw Accel深度解析:从零掌握Windows内核级鼠标加速的终极指南 【免费下载链接】rawaccel kernel mode mouse accel 项目地址: https://gitcode.com/gh_mirrors/ra/rawaccel 你是否厌倦了Windows默认鼠标加速的不稳定表现?是否在游戏中苦苦寻找更精…...
技术人的时间管理:高效利用每一天
技术人的时间管理:高效利用每一天 引言 作为一名技术人,我们每天都面临着大量的工作任务和学习需求。如何在有限的时间内高效完成工作、持续学习提升,同时保持良好的生活质量,是每个技术人都需要面对的挑战。 在过去的几年里&…...
Airflow Maintenance Dags:7个关键维护工作流彻底解决Airflow运维难题
Airflow Maintenance Dags:7个关键维护工作流彻底解决Airflow运维难题 【免费下载链接】airflow-maintenance-dags A series of DAGs/Workflows to help maintain the operation of Airflow 项目地址: https://gitcode.com/gh_mirrors/ai/airflow-maintenance-dag…...
重塑AI代理的数据智能:Wren AI如何构建开放上下文层
重塑AI代理的数据智能:Wren AI如何构建开放上下文层 【免费下载链接】WrenAI Turn any AI Agents into world-class data analysts through the open context layer that gives AI agents grounded, governed memory, context, SQL across 20 data sources, that he…...
别再用土办法改论文了!书匠策AI官网www.shujiangce.com才是2025届毕业生的“通关密码“
你有没有经历过这种崩溃瞬间? 凌晨两点,你对着电脑屏幕,查重率39%,AIGC疑似率67%。导师发来一条消息:"这篇不像你写的,重写。" 那一刻,你是不是特别想问一句:我到底该怎…...
三步破解安全研发合规难题:Gitee软件工厂助力GJB5000B与等保三级高标准落地
TL;DR 国家安全领域软件研发需同时满足GJB5000B、等保2.0三级等强制合规要求与智能化装备带来的软件复杂度挑战。传统研发模式在协作、安全、交付三方面日益乏力。Gitee软件工厂通过“统一底座、细粒度权限、标准化流程”三大核心能力,内置SM2/SM4国密加密、IP白名单…...
线粒体氧化磷酸化的新靶点:S-Gboxin的发现与研究进展
在肿瘤治疗的探索历程中,科学家们始终在寻找能够精准打击癌细胞而又最大限度保护正常组织的新型药物。2019年,一项发表在Nature杂志上的研究引起了学界广泛关注——施宇峰团队首次报道了Gboxin这一化合物的发现与独特的作用机制[1]。作为Gboxin的代谢稳定…...
