当前位置: 首页 > 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;十分繁琐…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...