【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. 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持

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

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

相关文章

sentinel网关限流配置及使用

sentinel控制台源码&#xff1a;https://download.csdn.net/download/yixin605691235/89543923 sentinel控制台jar包&#xff1a;https://download.csdn.net/download/yixin605691235/89543931 不同环境直接修改jar包中的application.yml文件中的nacos地址就可以了。 一、网关限…

【LeetCode 0169】【摩尔投票算法】主元素

Majority Element Given an array nums of size n, return the majority element. The majority element is the element that appears more than ⌊n / 2⌋ times. You may assume that the majority element always exists in the array. Example 1: **Input:** nums [3…

大数据信用查询有哪些问题值得注意呢?

随着大数据技术的不断发展&#xff0c;大数据信用报告成为一种新型的信用风险检测工具&#xff0c;被很多的银行和机构广泛用于信用风险评估&#xff0c;那大数据信用查询有哪些问题值得注意呢?本文就带大家一起去了解一下&#xff0c;希望对你有一定的帮助。 大数据信用查询这…

JsonCPP源码分析——分配器和配置器

1、allocator.h文件 该文件定义了一个分配器模版&#xff0c;该文件主要使用了内存对齐控制、rebind机制(C 标准库的分配器接口要求提供 rebind 机制&#xff0c;以支持不同类型的分配)、::operator new、std::addressof等技术。 内存对齐控制&#xff1a;之所以先保存当前内存…

《C++ 入门:第一个小程序》

《C 入门&#xff1a;第一个小程序》 在学习 C 的旅程中&#xff0c;编写第一个小程序是一个令人兴奋的时刻。它就像打开一扇通往新编程世界的大门&#xff0c;让我们初步领略 C 的魅力。 C 是一种强大而灵活的编程语言&#xff0c;广泛应用于各种领域&#xff0c;从系统编程…

python 方向梯度直方图(HOG)算法 【附两种实现方法并可视化】

目录 一、概述1.1 算法定义1.2 实现过程二、方法1(skimage库)2.1 代码实现2.2 结果示例三、方法2(cv2库)3.1 代码实现3.2 结果示例四、结果对比🙋 结果预览 一、概述 1.1 算法定义 方向梯度直方图(Histogram of Oriented Gradient,HOG):是应用在计算机视觉和图像处…

Telegram Bot、小程序开发(三)Mini Apps小程序

文章目录 一、Telegram Mini Apps小程序二、小程序启动方式三、小程序开发小程序调试模式初始化小程序Keyboard Button Mini Apps 键盘按钮小程序【依赖具体用户信息场景,推荐】**Inline Button Mini Apps内联按钮小程序**initData 的自动传递使用内联菜单时候哪些参数会默认传…

LLM微调

文章目录 一. 常见微调分类1.1 全量微调&#xff08;FFT&#xff1a;Full Fine-tuning&#xff09;1.2 参数高效微调(PEFT&#xff1a;Parameter-Efficient Fine-Tuning)1.3 指令微调&#xff08;IFT&#xff1a;Instructional Fine-tuning&#xff09;1.3.1 Hard prompt1.3.2 …

Docker存储目录问题,如何修改Docker默认存储位置?(Docker存储路径、Docker存储空间)etc/docker/daemon.json

文章目录 如何更改docker默认存储路径&#xff1f;版本1&#xff08;没测试&#xff09;版本2&#xff08;可行&#xff09;1. 停止 Docker 服务&#xff1a;2. 创建新的存储目录&#xff1a;3. 修改 Docker 配置文件&#xff1a;4. 移动现有的 Docker 数据&#xff1a;5. 重新…

Java-svg格式的oss图片链接转换为png格式图片字节流

一、引入依赖 <!--svg转其他格式依赖--> <dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>batik-transcoder</artifactId><version>1.14</version> </dependency> <dependency><groupId&g…

什么样的服务器是合乎直销网站标准

现在社会的发展,有着越来越多的人想要利用互联网来做直销。做好直销行业系统解决方案离不开好的服务器支持,服务器的的稳定性和速度是直接影响网站后期运作,可以看做是网站的根基。 做网站直销选择租用服务器需要注意的几点要素 一些大的直销互联网公司如安利、雅芳、康宝莱、玫…

【人工智能】自然语言处理(NLP)的突破,关注NLP在机器翻译、情感分析、聊天机器人等方面的最新研究成果和应用案例。

自然语言处理&#xff08;NLP&#xff09;作为人工智能的一个重要分支&#xff0c;近年来取得了显著的突破&#xff0c;特别在机器翻译、情感分析、聊天机器人等领域取得了显著的研究成果和广泛的应用。以下是对这些领域最新研究成果和应用案例的概述&#xff0c;并附带相应的代…

域名解析记录与服务器源IP的探索

在互联网中&#xff0c;域名和IP地址是进行网络通信的基础。用户通常通过域名来访问网站或服务&#xff0c;而实际的数据交换则发生在IP地址之间。域名解析&#xff08;DNS解析&#xff09;是将易于记忆的域名转换为计算机可识别的IP地址的过程。本文将探讨如何通过域名解析记录…

Uniapp自定义动态加载组件(2024.7更新)

1.本次介绍如何使用uniapp实现自定义动态加载Loading的组件&#xff0c;可以gif格式&#xff0c;也可以mp4格式等; 编写自定义Loading组件(CustomLoader.vue)&#xff1b;组件中含有“动态接收图片路径”&#xff0c;“10秒超时未false则自动断开关闭Loading”&#xff1b;在全…

【JavaScript 算法】广度优先搜索:层层推进的搜索策略

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、算法原理二、算法实现三、应用场景四、优化与扩展五、总结 广度优先搜索&#xff08;Breadth-First Search, BFS&#xff09;是一种用于遍历或搜索图或树数据结构的算法。该算法从起始节点开始&#xff0c;逐层向外扩展…

小程序-2(WXML数据模板+WXSS模板样式+网络数据请求)

目录 1.WXML数据模板 数据绑定 事件绑定 小程序中常用的事件 事件对象的属性列表 target和currentTarget的区别 bindtap的语法格式 在事件处理事件中为data中的数据赋值 事件传参与数据同步 事件传参 bindinput的语法绑定事件 文本框和data的数据同步 条件渲染 w…

《向量数据库指南》——使用 Grafana 和 Loki 搭建 Milvus Cloud日志查询系统

本教程将介绍如何设置 Grafana 和 Loki 来有效监控您的 Milvus Cloud实例。 Milvus Cloud是一款分布式向量数据库,可高效存储、索引和管理万亿级 Embedding 向量,是搭建 AI 和 ML 应用的首选向量数据库系统。 Grafana 是一个开源的指标监控平台,提供可视化的指标和日志…

5,SSH 端口转发

SSH 端口转发 简介 SSH 除了登录服务器&#xff0c;还有一大用途&#xff0c;就是作为加密通信的中介&#xff0c;充当两台服务器之间的通信加密跳板&#xff0c;使得原本不加密的通信变成加密通信。这个功能称为端口转发&#xff08;port forwarding&#xff09;&#xff0c…

SpringCloud | 单体商城项目拆分(微服务)

为什么要进行微服务拆分&#xff1f; 在平常的商城项目中&#xff0c;我们一般的项目结构模块都是将各种业务放在同一个项目文件夹&#xff0c;比如像&#xff1a; 用户&#xff0c;购物车&#xff0c;商品&#xff0c;订单&#xff0c;支付等业务都是放在一起&#xff0c;这样…

thinkphp:数据库多条件查询

一、使用if条件限制查询条件 $query Db::table(wip_operation_plan)->alias(d)->join([wip_jobs_all > a], a.wip_entity_name d.wip_entity_name)->join([sf_item_no > c], a.primary_itemc.item_no)->field(d.*,c.item_no as item_no,c.item_name as i…