博学谷——让IT教学更简单,让IT学习更有效
第2章 数据类型与运算符
学习目标
? 理解进制和进制转换
? 牢记C语言中的关键字和标识符定义规则 ? 掌握不同数据类型间的转换 ? 学会使用运算符进行运用
通过上一章的学习,相信大家对C语言已经有了一个初步认知。接下来的第2章将针对C语言开发中必须要掌握的进制、常量、变量、运算符等基础知识进行讲解。
2.1 数据存储的原理
2.1.1 进制
进制是一种计数机制,它可以使用有限的数字符号代表所有的数值。对于任何一种进制——X进制,就表示某一位置上的数在运算时逢X进一位。实际生活中也有很多进制的应用场景,例如时间每过60秒,分钟就会加1,这就是六十进制。再比如对学生进行分组时,假设8人一组,可以让学生进行报数,报满8个数就多了一个小组,这就是八进制。接下来将针对C语言中的二进制、八进制和十六进制分别进行讲解。
1、二进制
在绝大多数计算机系统中,数据都是通过二进制的形式存在的。二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个符号来表示的数。它的基数为2,进位规则是“逢二进一”。
例如计算二进制算术“1+1”,因为个位数1是该位上最大的数,所以再加1后就会向十位进一,个位改为0,所以二进制算术“1+1”的结果是二进制数10。
为了帮助大家更好地理解二进制,接下来通过二进制和十进制的对比来描述二进制的表示方式,如表2-1所示。
表2-1
十进制 0 1 2 3 4 二进制 0000 0001 0010 0011 0100 十进制与二进制对照表
十进制 5 6 7 8 9 二进制 0101 0110 0111 1000 1001 从表2-1可以看出,当用二进制表示十进制数字2时,由于二进制的符号只有0和1,所以根据“逢二进一”的规则,需要向高位进一位,表示为0010。同理,使用二进制表示十进制数字4时,继续向高位进一位,表示为0100。
需要注意的是,十进制和二进制只是针对数字的不同表示方式,无论采用哪种方式表示一个数,它的值都是一样的。以十进制数7为例,十进制由符号“7”组成 ,而二进制由符号 “0”、“1”、“1”和“1”组成。
1
博学谷——让IT教学更简单,让IT学习更有效
2、八进制
八进制是一种“逢八进一”的进制,它由0~7这八个符号来描述。同样地,此处通过十进制和八进制的对比来描述八进制的表示方式,如表2-2所示。
表2-2
十进制 0 1 2 3 4 5 6 7 8 八进制 0 1 2 3 4 5 6 7 10 十进制与八进制对照表
十进制 9 10 11 12 13 14 15 16 17 八进制 11 12 13 14 15 16 17 20 21 从表2-2中可以看出,当使用八进制表示十进制数字8时,由于表示八进制的符号只有0~7,因此,根据逢八进一的规则,需要向高位进一位,表示为10。同理,使用八进制表示十进制数字16时,继续向高位进一位,表示为20。
3、十六进制
十六进制是一种“逢十六进一”的进制,它由0~9、A~F这十六个符号来描述。下面通过十进制和十六进制的对比来描述十六进制的表示方式,如表2-3所示。
表2-3
十进制 0 1 2 3 4 5 6 7 8 9 10 十六进制 0 1 2 3 4 5 6 7 8 9 A 十进制与十六进制对照表
十进制 17 18 19 20 21 22 23 24 25 26 27 十六进制 11 12 13 14 15 16 17 18 19 1A 1B
2
博学谷——让IT教学更简单,让IT学习更有效
11 12 13 14 15 16 B C D E F 10 28 29 30 31 32 33 1C 1D 1E 1F 20 21 从表2-3中可以看出,当使用十六进制表示十进制数字16时,由于表示十六进制的符号只有0~9、A~F,因此,根据逢“逢十六进一”的规则,需要向高位进一位,表示为10。同理,使用十六进制表示十进制数字32时,继续向高位进一位,表示为20。
2.1.2 进制转换
通过前面内容的学习,读者应该知道在计算机中一个数值可以用不同的进制形式来表示,但实际上,不管是哪种进制形式来表示,数值本身是不会发生变化的。因此,各种进制之间可以轻松地实现转换,下面就以十进制、二进制、八进制、十六进制为例来讲解如何实现进制转换。
一、十进制与二进制之间的转换
十进制与二进制之间的转换是最常见也是必须掌握的一种进制转换方式,下面针对十进制转二进制和二进制转十进制的方式分别进行讲解。 1、十进制转二进制
十进制转换成二进制可以采用除2取余的方式。也就是说将要转换的数,先除以2,获得商和余数,将商继续除以2,获得商和余数,此过程一直重复直到商为0。最后将所有得到的余数倒序排列,即可得到转换结果。
接下来就以十进制的6转换为二进制为例进行说明,其演算过程如图2-1所示。
除数 被除数 余数2226310图2-1 十进制转二进制
从图2-1中可以看出,十进制的6连续三次除以2后,得到的余数依次是:0、1、1。将所有余数倒序排列后为110,因此,十进制的6转换成二进制后的结果是110。
2、二进制转十进制
二进制转化成十进制要从右到左用二进制位上的每个数去乘以2的相应次方,例如,将最右边第一位的数乘以2的0次方,第二位的数乘以2的1次方,第n位的数乘以2的n-1次方,然后把所有乘的结果相加,得到的结果就是转换后的十进制。
例如,把一个二进制数0110 0100转换为10进制,转换方式如下:
0 * 20 + 0 * 21 + 1 * 22 + 0 * 23 + 0 * 24 + 1 * 25 + 1 * 26+ 0 * 27 = 100
011
由于0乘以多少都是0,所以上述表达式也可以简写为:
1 * 22 + 1 * 25 + 1 * 26 = 100
得到的结果100就是二进制数0110 0100转化后的十进制表现形式。 二、八进制与二进制之间的转换
3
博学谷——让IT教学更简单,让IT学习更有效
该类转换通常是二进制转换成八进制,在转换的过程中有一个技巧,就是将二进制数自右向左每三位分成一段(若不足三位,左边用0补齐),然后将二进制每段的三位转为八进制的一位,转换过程中数值的对应关系如表2-4所示。
表2-4
二进制和八进制数值对应表 二进制 000 001 010 011 100 101 110 111 八进制 0 1 2 3 4 5 6 7 接下来,就以将二进制数00101010为例来演示如何转为八进制,具体演算过程如下: (1)每三位分成一段,结果为:000 101 010; (2)将每段的数值分别查表替换,结果如下:
010 ? 2 101 ? 5 000 ? 0
(3)将替换的结果进行组合,组合后的八进制为0052(注意八进制必须以0开头)。
八进制转换成二进制的过程正好相反,只需将八进制数中每一位数转换成对应的三位二进制数即可。 三、十六进制与二进制之间的转换
将二进制转十六进制时,与转八进制类似,不同的是要将二进制数每四位分成一段(若不足4位用0补齐),查表转换即可。二进制转十六进制过程中数值的对应关系如表2-5所示。
表2-5 二进制 0000 0001 0010 0011 0100 0101 0110 0111 二进制和十六进制数值对应表 十六进制 0 1 2 3 4 5 6 7
二进制 1000 1001 1010 1011 1100 1101 1110 1111 十六进制 8 9 A B C D E F 接下来,二进制数01010110转为十六进制,具体步骤如下:
4
博学谷——让IT教学更简单,让IT学习更有效
(1)每四位分成一段,结果为:0101 0110; (2)将每段的数值分别查表替换,结果如下:
0110 ? 6 0101 ? 5
(3)将替换的结果进行组合,转换的结果为:0x56或0X56(注意十六进制必须以0x或者0X开头)。
上述讲解了二进制与其他进制的转换,除二进制外,其他进制之间的转换也很简单,只需将它们转换成二进制数,然后将二进制转为其他进制即可。
?多学一招:小数的二进制
十进制小数转换为二进制采用“乘2取整”规则。方法是用2乘以十进制小数部分,将其结果的整数部分去掉,用2乘以余下的小数部分,再去掉其结果的整数部分;如此继续下去,直到余下的小数部分为0或满足所要求的精度为准。最后将每次得到的整数部分(0或1)按先后顺序从前至后排列,即为小数对应的二进制。例如:将小数0.8125转换为二进制,转换过程如图2-2所示。
0.8125×21.6250????????取整数:1.6250×21.2500????????取整数:1.25×2 .50????????取整数:0×2 1.0????????取整数:1(0.8125)10=(0.1101)2顺序排列
图2-2 十进制小数转换为二进制
由图2-2所示十进制0.8125连续4次乘以2使得小数部分为0,所得整数依次为1、1、0、1,所以转换后结果为0.1101。
需要注意的是,有些十进制小数不一定能完全精确的转换为二进制,可以根据精度要求转换到小数点后某一位为止。
2.1.3 原码、反码、补码
一个数在计算机中的二进制存储形式,叫做这个数的机器数。机器数是带符号的,在计算机中用一个数的最高位存放符号,最高位为0表示是正数,最高位为1表示是负数。比如十进制数3的机器数是0000 0011;如果是-3,它的机器数就是1000 0011。
带符号位的机器数对应的真正数值称为机器数的真值。例如,0000 0011的真值是3,1000 0011的真值是-3。需要注意的是,机器数的真值和机器数转换成十进制数是不一样的,例如1000 0011转换成十进制数是131,但由于机器数的最高位存放符号,因此机器数的真值是-3。
机器数有原码、补码、反码这三种表现形式。计算机将一个数以二进制形式存储时,会将该数分别进行求原码、求反码、求补码这三步操作,最终将得到的机器数存入内存。
1、原码
原码就是符号位加上真值的绝对值。例如,1的原码为 0000 0001,-1的原码为1000 0001。 2、反码
反码的表示方法是:正数的反码是其原码,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。例如1的原码是0000 0001,反码也是0000 0001,而-1的原码是1000 0001,反码则是1111 1110。
3、补码
补码的表示方法是:正数的补码就其原码,负数的补码是在其反码的基础上+1。例如1的原码是0000 0001,反码是0000 0001,补码也是0000 0001,而-1的原码是1000 0001,反码是1111 1110,补码则是1111 1111。
5