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

C语言————原码 补码 反码 (试图讲清楚版)

本文的内容通下面这篇文章有着紧密的联系,读者可以选择性阅读 

C语言————二、八、十、十六进制的相互转换-CSDN博客

基本概念

我们知道不同进制的数字,归根结底都是一个个不同的表现形式 。

原码、补码和反码是整数类型在计算机内部以二进制存储时的三种不同表现形式,虽然整数具有这三种类型的存储方式,但是在内存中以补码的形式进行存储。

有符号整数在这三种方法中均由符号位数值位两部分组成,在二进制序列中,最高的一位被视为符号位,其余都是数值位。

下面我们对这三种方式进行逐一介绍:

原码:直接将数字按照二进制转换方法得到的就是原码

反码:符号位不变,其余位依次取反得到的就是反码

补码:反码+1得到的就是补码

:知道一个负整数的补码或者反码,想求这个负整数的值,那么应该将补码或者反码逆推回去得到原码,再由原码进行计算得到的值才是正确的,在计算中,符号位不参与权重,仅用以判断正负。

正整数的原码、反码、补码都相同;

负整数的原码、反码、补码有如下的转换形式(转换中符号位不变):

在对这三种形式运用的深入之前,我们先进行一个前置的知识储备。 

数据的存储方式

我们知道,计算机内部采用二进制存储所有数据,原因是电子元件(如晶体管)的 “导通” 与 “截止” 两种状态可直接对应二进制的 “1” 和 “0”,物理实现简单且稳定。

基本存储单位

我们知道一个int的字节大小为4,那么他的二进制位数为32位,接下来我们会用int来介绍三种码之间的运用方式。

数据的计算方式

在计算机中,数据的计算和存储都是通过补码来完成的。这是因为使用补码可以对符号位和数值域进行统一的处理,同时加减法也可以进行统一处理(CPU处理器只有加法器),此外,原码和补码的相互转换,二者的方式是相同的,也不需要额外的电子元件。

那为什么使用补码而不是原码呢?

原码是利用最高位表示符号(0 代表正数,1 代表负数),其余位表示数值的绝对值。不过,原码在进行加减法运算时会碰到一些难题:

  • 符号位处理复杂:在进行加减法运算时,需要先判断操作数的符号,然后再决定是进行加法还是减法运算。
  • 存在正负零:原码中存在两种零的表示方式,即+0(0000)和-0(1000),这会使比较操作变得复杂。
  • 减法运算困难:当进行减法运算时,需要设计专门的电路来执行减法操作,这增加了硬件的复杂度。

补码是通过对原码取反后加 1 得到的,它成功解决了原码存在的上述问题。

  • 统一加减法运算:在补码系统中,减法可以转换为加法来进行计算,比如A - B可以表示为A + (-B)。这样一来,计算机就不需要设计专门的减法电路,只需一个加法器就能完成加减法运算。
  • 消除正负零:在补码表示中,零只有一种表示形式,即0000。而1000则被用来表示-8,这使得数值的表示范围得到了扩展。(+0和-0的补码结果时一致的,所以只有一种表示形式
  • 简化硬件设计:由于加减法运算可以统一用加法器来实现,硬件设计变得更加简单,同时还能减少出错的概率。
    int main()
    {//1 - 1//1 + (-1)//00000000000000000000000000000001 ---- 1的原码//00000000000000000000000000000001 ---- 1的补码//00000000000000000000000000000001 ---- 1的反码//10000000000000000000000000000001 ---- -1的原码//11111111111111111111111111111110 ---- -1的反码//11111111111111111111111111111111 ---- -1的补码//那么我们用原码进行计算时我们可以得到值为10000000000000000000000000000010  即-2,与结果不符//我们使用补码进行计算时可以得到00000000000000000000000000000000    即0,数值相符return 0;
    }

    通过上述代码,我们发现,使用原码进行计算时(相当于没有考虑正负符号直接求和),得到的结果与值不符,而补码计算时完美的弥补了他的不足。

补码的模运算原理 

补码其实是一种模运算系统。对于 n 位二进制数,其模为 2ⁿ。例如,4 位二进制数的模就是 16。在模运算中,减去一个数就相当于加上这个数的补数,即x - y ≡ x + (2ⁿ - y) (mod 2ⁿ)

以 4 位二进制数计算5 - 3为例:

  • 可以转化为5 + (-3)

  • -3的补码为1101(也就是16 - 3 = 13

  • 计算5 + 13 = 18,由于模为 16,18 mod 16 = 2,结果正确。

另,整数值和其补码对应的值由如下对应关系:

  • 正数:直接表示为二进制,范围是 0 到 2^(n-1)-1

  • 负数-N 表示为 2^n - N,范围是 -2^(n-1) 到 -1

    例如,4 位补码的模是 16

  • -5 表示为 16 - 5 = 11(二进制 1011)。{取反+1得到1101即-5}

  • -8 表示为 16 - 8 = 8(二进制 1000)。{取反+1得到0000,这是错误的示范,8在4位二进制无法用原码表示,进一步体现了原码的局限性}

———————————————————————————————————————————

后续会更新针对于二进制数的相关操作符

有表述不当的地方辛苦大家指出,三克油。

打怪升级中................................................................................................................................................

http://www.xdnf.cn/news/16147.html

相关文章:

  • AWS CAF:企业云转型的战略指南
  • Go语言环境搭建与VS Code开发配置
  • 服务端处于 TIME_WAIT 状态的 TCP 连接,收到相同四元组的 SYN 后会发生什么?详解
  • 前端-html+CSS基础到高级(一)html基础
  • Oracle 的单体安装
  • 金仓数据库:融合与智能驱动下的革新与未来
  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——5. 集成OpenCV:让程序拥有“视力”
  • 融合与智能:AI 浪潮驱动下数据库的多维度进化与产业格局重塑新范式
  • 数据结构2-集合类ArrayList与洗牌算法
  • 语义分割-FCN-听课记录
  • 【Java学习】匿名内部类的向外访问机制
  • 纳米编辑器之Nano 编辑器退出**的详细操作指南
  • 《C++ string 完全指南:string的模拟实现》
  • 神经网络实战案例:用户情感分析模型
  • rust-枚举
  • CentOS7 安装 rust 1.82.0
  • B站 XMCVE Pwn入门课程学习笔记(5)
  • Text2SQL智能问答系统开发(一)
  • vue3:十八、内容管理-搜索栏的完善
  • Sklearn 机器学习 数值标准化
  • HTTP/1.0、HTTP/1.1 和 HTTP/2.0 主要区别
  • LeetCode 2322:从树中删除边的最小分数
  • M3295NL专为千兆以太网设计,支持100/1000Mbps全双工通信M3295支持4对5类UTP电缆
  • 【C++】标准模板库(STL)—— 学习算法的利器
  • 力扣20:有效的括号
  • 【Java工程师面试全攻略】Day12:系统安全与高可用设计
  • Spring Cloud OpenFeign 常用注解_笔记
  • SpringCloud【Sentinel】
  • mac llama_index agent算术式子计算示例
  • AUTOSAR进阶图解==>AUTOSAR_SWS_BSWGeneral