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

数字规则:进制转换与原码、反码、补码

目录

一.不同进制的转换​

1.二进制与十进制的转换​

(1).二进制转十进制​

(2).十进制转二进制​

2.二进制与十六进制的转换​

(1).二进制转十六进制​

(2).十六进制转二进制​

3.二进制与八进制的转换​

(1).二进制转八进制​

(2).八进制转二进制​

4.十进制、十六进制和八进制之间的转换​

二.不同进制的使用范围​

1.二进制​

2.十进制​

3.十六进制​

4.八进制​

三.原码:最直观的数字表示​

1.原码的表示规则​

2.原码的计算示例​

(1).正数原码计算​

(2).负数原码计算​

(3).原码的特点与局限​

四.反码:为运算铺路的过渡编码​

1.反码的计算示例​

(1).正数反码计算​

(2).负数反码计算​

2.反码的运算特性​

五.补码:计算机底层的运算核心​

1.补码的计算示例​

(1).正数补码计算​

(2).负数补码计算​

2.补码的核心优势解析​

六.三种编码的对比与应用场景​

七.编码转换实战:从十进制到补码​

1.转换为二进制原码​

2.计算反码​

3.计算补码​

总结


在计算机的数字世界里,所有信息最终都以二进制形式存储和处理。而理解原码、反码和补码这三种编码方式,是揭开计算机数值运算奥秘的关键。同时,二进制、十进制、十六进制和八进制的相互转换,也与编码的计算和应用紧密相连。本文将用通俗语言,通过大量实例,带您深入理解这三种编码的原理与应用,以及不同进制间的转换规则和使用范围。

一.不同进制的转换​

1.二进制与十进制的转换​

(1).二进制转十进制​

方法:按位权展开求和。二进制数从右至左,每一位的位权分别是​2^{0}2^{1}2^{2},……。

例如,将二进制数10110转换为十进制数:​从右至左,将二进制数的每一位与2的相应幂次相乘,再将结果相加。

具体步骤为:最右边的0对应,乘积为0×2^{0}=0;第二位1对应​,乘积为1×2^{1}=2;第三位1对应,乘积为1×2^{2}=4;第四位0对应,乘积为0×2^{3}=0;最左边的1对应,乘积为1×2^{4}=16。最后将所有乘积相加:0+2+4+0+16=22,因此,二进制数10110对应的十进制数为22。​​

(2).十进制转二进制​

方法:除2取余法,将十进制数除以2,取余数,然后将商继续除以2,直到商为0,最后将所有余数从下往上排列。​

例如,将十进制数45转换为二进制数:​

45 ÷ 2 = 22 余 1​

22 ÷ 2 = 11 余 0​

11 ÷ 2 = 5 余 1​

5 ÷ 2 = 2 余 1​

2 ÷ 2 = 1 余 0​

1 ÷ 1 = 0 余 1​

从下往上读取余数,得到二进制数101101。​

2.二进制与十六进制的转换​

(1).二进制转十六进制​

方法:从右至左,每4位二进制数为一组,不足4位的在高位补0,然后将每组二进制数转换为对应的十六进制数(0-9对应0-9,10-15对应A-F)。​

例如,将二进制数11010110转换为十六进制数:​

将其分为两组:1101和0110。​

1101转换为十六进制是D,0110转换为十六进制是6,所以结果为D6。​

(2).十六进制转二进制​

方法:将十六进制的每一位转换为对应的4位二进制数。​

例如,将十六进制数3A转换为二进制数:​

3转换为二进制是0011,A(即10)转换为二进制是1010,所以结果为00111010。​

3.二进制与八进制的转换​

(1).二进制转八进制​

方法:从右至左,每3位二进制数为一组,不足3位的在高位补0,然后将每组二进制数转换为对应的八进制数(0-7)。​

例如,将二进制数110101转换为八进制数:​

分组为001,101,010(高位补0)。​

001转换为八进制是1,101转换为八进制是5,010转换为八进制是2,所以结果为152。​

(2).八进制转二进制​

方法:将八进制的每一位转换为对应的3位二进制数。​

例如,将八进制数73转换为二进制数:​

7转换为二进制是111,3转换为二进制是011,所以结果为111011。​

4.十进制、十六进制和八进制之间的转换​

通常先将其转换为二进制,再通过二进制转换为目标进制。

例如,将十进制数25转换为十六进制数:​

先将25转换为二进制数11001,再将二进制数11001转换为十六进制数19。​

二.不同进制的使用范围​

1.二进制​

应用场景:计算机底层数据存储、传输和运算。因为计算机硬件只能识别0和1两种状态,所以二进制是计算机最基础的语言。例如,CPU处理的指令、内存中存储的数据,都是以二进制形式存在的。​

优势:易于硬件实现,运算规则简单,只有0和1两种状态,电路的通断、电平的高低可以很方便地表示0和1。​

缺点:书写冗长,不便于人类阅读和书写。​

2.十进制​

应用场景:日常生活和商业计算中广泛使用。如货币计算、年龄统计、数量计量等。在编程中,也常用于表示直观的数值,方便程序员理解和输入。​

优势:符合人类的计数习惯,易于理解和使用。​

缺点:对于计算机硬件来说,处理十进制数需要先转换为二进制,增加了运算复杂度。​

3.十六进制​

应用场景:在计算机领域常用于表示内存地址、颜色值(如网页设计中的RGB颜色用十六进制表示)、字节数据等。因为十六进制数与二进制数转换方便,且书写比二进制简洁。​

优势:缩短二进制数的书写长度,便于阅读和记录,同时与二进制的转换规则固定且简单。​

缺点:不符合日常计数习惯,对于不熟悉计算机领域的人来说较难理解。​

4.八进制​

应用场景:早期在UNIX系统中用于表示文件权限等,现在使用相对较少,但在一些特定的嵌入式系统开发或底层编程中仍有应用。​

优势:与二进制转换方便,在某些场景下比二进制更简洁。​

缺点:应用范围较窄,逐渐被十六进制取代。​

三.原码:最直观的数字表示​

原码是最简单的机器数表示方法,其核心规则可以概括为:符号位+数值位。​

1.原码的表示规则​

符号位:用二进制最高位表示,0代表正数,1代表负数。​

数值位:直接将十进制数转换为二进制数。在转换时,若数值不足指定位数,需要在高位补0。例如,要表示8位二进制原码,对于数值较小的数,就需要在高位补0以凑足8位。​

2.原码的计算示例​

(1).正数原码计算​

以十进制数+13为例,将其转换为二进制数。使用除2取余法:​

13 ÷ 2 = 6 余 1​

6 ÷ 2 = 3 余 0​

3 ÷ 2 = 1 余 1​

1 ÷ 1 = 0 余 1​

从下往上读取余数,得到二进制数1101。因为是正数,符号位(最前面的数字位)为0,所以8位原码为00001101。

(2).负数原码计算​

以十进制数-27为例,先将27转换为二进制数:​

27 ÷ 2 = 13 余 1​

13 ÷ 2 = 6 余 1​

6 ÷ 2 = 3 余 0​

3 ÷ 2 = 1 余 1​

1 ÷ 1 = 0 余 1​

得到二进制数11011。因为是负数,符号位为1,不足8位在高位补0,所以8位原码为10011011。​

(3).原码的特点与局限​

优点:直观易懂,与十进制转换简单,只需确定符号位,再将数值部分转换为二进制即可。​

缺点:0有两种表示形式(+0为00000000,-0为10000000)。​

致命缺陷:无法直接进行加减法运算。例如计算3+(-3)的原码运算:​

00000011(+3)​

10000011(-3)​

=10000110(-6)→结果错误​

从上述计算可以看出,直接使用原码进行加减法运算,得到的结果是错误的,这就需要新的编码方式来解决运算问题。​

四.反码:为运算铺路的过渡编码​

反码的出现是为了解决原码运算的缺陷,其转换规则为:​

正数:反码与原码相同。​

负数:符号位不变,其余各位按位取反(0变1,1变0)。​

1.反码的计算示例​

(1).正数反码计算​

以十进制数+17为例,先计算其原码。17转换为二进制数:​

17 ÷ 2 = 8 余 1​

8 ÷ 2 = 4 余 0​

4 ÷ 2 = 2 余 0​

2 ÷ 2 = 1 余 0​

1 ÷ 1 = 0 余 1​

得到二进制数10001,8位原码为00010001。因为是正数,所以反码与原码相同,即00010001 。​

(2).负数反码计算​

以十进制数-19为例,先计算其原码。19转换为二进制数:​

19 ÷ 2 = 9 余 1​

9 ÷ 2 = 4 余 1​

4 ÷ 2 = 2 余 0​

2 ÷ 2 = 1 余 0​

1 ÷ 1 = 0 余 1​

得到二进制数10011,8位原码为10010011。

因为是负数,符号位不变,其余位取反,得到反码11101100。​

2.反码的运算特性​

解决0的表示问题:+0和-0的反码分别为00000000和11111111。​

加减法运算规则:使用反码进行运算时,符号位需参与运算,且结果需再转换为原码。

2+(-2)的反码计算:​

00000010(+2反码)​

11111101(-2反码)​

=11111111(结果反码)→转换为原码10000000(-0)​

仍存在缺陷:0的两种表示形式未完全解决,运算结果需额外转换,使用起来不够便捷。​

五.补码:计算机底层的运算核心​

补码是现代计算机中实际使用的数值编码方式,其设计思想源于"模运算"原理(类似钟表调时的进位逻辑)。补码的转换规则为:​

正数:补码与原码、反码相同。​

负数:符号位不变,其余各位取反后加1(即反码+1)。​

1.补码的计算示例​

(1).正数补码计算​

以十进制数+23为例,先计算其原码。23转换为二进制数:​

23 ÷ 2 = 11 余 1​

11 ÷ 2 = 5 余 1​

5 ÷ 2 = 2 余 1​

2 ÷ 2 = 1 余 0​

1 ÷ 1 = 0 余 1​

得到二进制数10111,8位原码为00010111。因为是正数,所以补码与原码相同,即00010111 。​

(2).负数补码计算​

以十进制数-25为例,先计算其原码。25转换为二进制数:​

25 ÷ 2 = 12 余 1​

12 ÷ 2 = 6 余 0​

6 ÷ 2 = 3 余 0​

3 ÷ 2 = 1 余 1​

1 ÷ 1 = 0 余 1​

得到二进制数11001,8位原码为10011001。然后计算反码,符号位不变,其余位取反,得到反码11100110。最后计算补码,反码+1,得到补码11100111。​

2.补码的核心优势解析​

统一0的表示:+0和-0的补码均为00000000。​

0的补码计算:​

10000000(-0原码)→11111111(反码)→10000000(补码+1后溢出最高位)​

简化运算逻辑:计算机仅需实现补码加法器,即可完成所有数值运算。​

3+(-3)的补码计算:​

00000011(+3补码)​

11111101(-3补码)​

=100000000(结果补码)→舍弃最高位后为00000000(正确结果0)​

扩展数值范围:8位补码可表示-128~127,比原码/反码多表示一个数(-128的补码为10000000) 。​

六.三种编码的对比与应用场景​

编码类型​

正数表示​

负数表示规则​

0的表示​

运算特性​

原码​

符号位0+数值位​

符号位1+数值位​

+0/-0两种形式​

无法直接运算​

反码​

与原码相同​

符号位1+数值位取反​

+0/-0两种形式​

符号位参与运算,需转换结果​

补码​

与原码相同​

反码+1​

唯一表示 00000000​

直接支持加减运算​

原码:仅用于逻辑判断或简单数值显示。例如,在一些不需要进行数值运算,只需要直观展示数值正负和大小的场景中,可能会使用原码表示。​

反码:作为原码到补码的转换中间步骤。在计算机底层进行补码计算时,可能会先将原码转换为反码,再进一步得到补码。​

补码:计算机底层存储、运算的唯一编码形式。无论是整数的加减乘除运算,还是数据在内存中的存储,都以补码的形式进行。​

七.编码转换实战:从十进制到补码​

以十进制数-32为例,演示完整编码转换流程:​

1.转换为二进制原码​

32转换为二进制数:​

32 ÷ 2 = 16 余 0​

16 ÷ 2 = 8 余 0​

8 ÷ 2 = 4 余 0​

4 ÷ 2 = 2 余 0​

2 ÷ 2 = 1 余 0​

1 ÷ 1 = 0 余 1​

得到二进制数100000。因为是负数,符号位为1,不足8位在高位补0,所以8位原码为 10100000。​

2.计算反码​

符号位不变,其余位取反,得到反码11011111。​

3.计算补码​

反码+1,得到补码11100000。​

验证补码运算:​

计算32+(-32)的补码运算:​

00100000(+32补码)​

11100000(-32补码)​

=100000000→舍弃进位后为00000000(正确结果0)​

总结

计算机编码与进制转换是数字世界的重要基石。二进制、十进制、十六进制和八进制各有其用,二进制用于计算机底层,十进制贴近生活,十六进制和八进制在特定场景发挥作用,它们之间可通过特定规则相互转换。原码、反码、补码是数值的编码方式,原码直观却无法直接运算,反码作为过渡存在缺陷,补码统一0的表示、简化运算,成为计算机底层运算核心。掌握这些知识,能深入理解计算机数值处理逻辑,为编程与开发打下坚实基础。

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

相关文章:

  • 第九天:java注解
  • Cesium快速入门到精通系列教程三:添加物体与3D建筑物
  • Flickr30k Entities短语定位评测指南
  • 进阶日记(一)大模型的本地部署与运行
  • MATLAB实战:人脸检测与识别实现方案
  • 并发执行问题 (上)
  • 【计网】第六章(网络层)习题测试
  • Linux正则三剑客篇
  • 【火山引擎 大模型批量推理数据教程---详细讲解一篇过!】
  • 哈希:闭散列的开放定址法
  • #14 【Kaggle】 Drawing with LLMs 金牌方案赏析
  • 简析PointNet++
  • leetcode0404. 左叶子之和-easy
  • 对选择基于模型编程(MBD)的工作对职业发展影响的讨论 (2025)
  • 【Bluedroid】蓝牙启动之 l2c_init 源码解析
  • 字符函数和字符串函数(1)
  • 上位机知识篇---直接无线数据通信
  • 线程与进程
  • 【Dv3Admin】系统视图用户管理API文件解析
  • Redis 架构设计
  • Kali Linux从入门到实战:系统详解与工具指南
  • Fréchet Inception Distance(FID)
  • ubuntu系统更换镜像源
  • [GESP202412 五级] 奇妙数字
  • java 多线程中的volatile关键字作用
  • 【JavaScript-Day 28】告别繁琐循环:`forEach`, `map`, `filter` 数组遍历三剑客详解
  • c++之循环
  • java CountDownLatch‌
  • 题海拾贝:压缩字符串
  • 详解鸿蒙开发如何上传三方库到ohpm仓库