引言
在计算机科学领域,二进制数的表示方式以及不同进制之间的转换是基础且重要的知识点。本篇文章将深入探讨C语言中数字的原码、反码、补码表示方法,以及二进制与其他进制(十进制、八进制、十六进制)之间的转换原理与实现方式。理解这些概念对于编程实践和计算机系统底层原理的学习都具有重要意义。
二进制基础
进制的概念
进制,即计数系统,是数值的不同表示形式。常见的进制包括二进制、八进制、十进制和十六进制。每种进制都有其特定的基数和位权。
以数字15为例,它在不同进制中的表示形式如下:
- 二进制:1111
- 八进制:17
- 十进制:15
- 十六进制:F
进制的基本原理
进制的核心原理在于"逢基进一"。例如:
- 十进制中,满10进1,每一位由0-9的数字组成
- 二进制中,满2进1,每一位由0-1的数字组成
以十进制数123为例,其值计算方式为:
123 = 1×10² + 2×10¹ + 3×10⁰
同样,二进制数1101的十进制值计算方式为:
= 1×2³ + 1×2² + 0×2¹ + 1×2⁰ = 13
注意:为了区分不同的进制,我们在将每个数字用括号括起来,右下角写一个角标,用来表示这是几进制的数字,例如,2进制的1011就是这样表示的: ,未写角标的统一默认为10进制。还有,像2进制的
就不能再读成一千零一十一了,因为这是十进制的读法,个人觉得最好的读法就是:一零一一。
其他进制转十进制
将其他进制的数转换为十进制的基本方法是:每一位上的数字乘以该位的权值,然后相加。
例如,二进制数1101转十进制的计算过程:
= 1×2³ + 1×2² + 0×2¹ + 1×2⁰ = 8 + 4 + 0 + 1 = 13
八进制数37转十进制:
= 3×8¹ + 7×8⁰ = 24 + 7 = 31
十六进制数1A转十进制:
= 1×16¹ + 10×16⁰ = 16 + 10 = 26
说明:16进制,逢16进1 ,应该有0~15个数字组成,但是目前的阿拉伯数字只有0~9,为了区分12是12还是 1 2,就用a~f 来代替10~15,当然,字母也可以换成大写的。例如:A就代表10.
十进制转其他进制
将十进制数转换为其他进制的基本方法是"除基取余",即不断地除以目标进制并记录余数。
十进制转二进制
例如,将十进制数13转为二进制:
- 13 ÷ 2 = 6 余 1
- 6 ÷ 2 = 3 余 0
- 3 ÷ 2 = 1 余 1
- 1 ÷ 2 = 0 余 1
将余数从下往上排列,得到。
十进制转八进制
将十进制数31转为八进制:
- 31 ÷ 8 = 3 余 7
- 3 ÷ 8 = 0 余 3
余数从下往上排列,得到。
十进制转十六进制
将十进制数26转为十六进制:
- 26 ÷ 16 = 1 余 10(A)
- 1 ÷ 16 = 0 余 1
余数从下往上排列,得到。
二进制转八进制和十六进制
二进制转八进制
先来看下面的内容;
发现,三位的二进制数竟然可以完美的表示0~7,而8进制刚好由0~7组成,因此,在二进制转换8进制的时候,可以从右往左,每三个数字为一组,然后转换成0~7的数字就可以了,例如:
(1010101) = (125)
同理,2进制转换16进制也是如此。
原码、反码、补码
原码就是将一个数据直接翻译为二进制形式,通常来说有32位,而最高位为符号位,其余位为数值位。
正数的最高位为0,而负数的最高位为1
例如,3在计算机中的原码是:00000000000000000000000000000011
-5在计算机中的原码是:10000000000000000000000000000101
正数的原码、反码、补码都是一样的
负数的原码、反码、补码各不相同,需要进行计算
负数的反码就是:除了符号位(最高位)不变,其余的位数上,0变1,1变0;
负数的补码就是:反码加1;
例如,-5
原码:10000000000000000000000000000101
反码:11111111111111111111111111111010 //这里0和1的宽度不一样,所以显得反码的位数少
补码:11111111111111111111111111111011
当然,补码转原码可以原路返回,也可以先1变0,0 变1,然后再加1.
总结
在计算机内部,数据的存储方式和进制的转换是非常重要的概念。通过理解数据在内存中的存储和二进制与其他进制之间的转换,程序员可以更有效地进行编程和数据处理。在开发过程中,正确掌握这些知识可以帮助我们更好地理解计算机的运作原理,并提高我们的编程能力。