本文主要讲解的知识点是进制数,数据类型及其转换,运算符。
1.进制数及其转换
进制是一种计数机制,它可以使用有限的数字符号代表所有的数值。对于任何一种进制——X 进制, 就表示某一位置上的数运算时逢 X 进一位。对于计算机系统来说,常见的进制数有二进制,八进制,十进制及十六进制。
(1)二进制
对于绝大多数计算机系统来说,数据都是通过二进制的形式存在的。二进制是一种“逢二进一”的机制, 它用 0 和 1 两个符号来描述。通过二进制和十进制的对比来描述 二进制的表示方式,如下图:
可以看出,当用二进制表示十进制数字 2 时,由于二进制的数码只有 0 和 1,所以根据“逢 二进一”的规则,需要向高位进一位,表示为 0010。同理,使用二进制表示十进制数字 4 时,继续向高位 进一位,表示为 0100。
(2)八进制与十六进制
八进制是一种“逢八进一”的进制,它由 0~7 八个符号来描述。同样地,此处通过十进制和八进制的 对比来描述八进制的表示方式,如下图:
十六进制是一种“逢十六进一”的进制,它由 0~9、A~F 十六个符号来描述。下面通过十进制和十六 进制的对比来描述十六进制的表示方式,如下图:
(3)进制之间的转换
1、十进制转二进制 (除K取余法,K指需要转换的进制单位)
十进制转换成二进制可以采用除 2 取余的方式。也就是说将要转换的数,先除以 2,得到商和余数, 将商继续除以 2,获得商和余数,此过程一直重复直到商为 0。最后将所有得到的余数倒序排列,即可得 到转换结果。
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
由于 0 乘以多少都是 0,所以上述表达式也可以简写为:
1 * 22 + 1 * 25 + 1 * 26 = 100
得到的结果 100 就是二进制数 0110 0100 转化后的十进制表现形式。
3.二进制转换为八进制与十六进制
八进制与二进制之间的转换比较常见的操作就是将一个二进制数转为八进制。在转换的过程中有一个 技巧,就是将二进制数自右向左每三位分成一段(若不足三位,用 0 补齐),然后将二进制每段的三位转 为八进制的一位,转换过程中数值的对应关系如下表:
二进制转换为十六进制同理;
总之,简单来说,二进制-->八进制:将二进制数从右向左每三位依次划分,左边不足补0;
二进制->十六进制:将二进制数从右向左每四位依次划分,左边不足补0.
2.数据类型及其转换
C语言的数据类型有许多种,具体的见下图。
1、整型变量 在程序开发中,经常会遇到 0、-100、1024 等数字,这些数字都可称为整型。整型就是一个不包含小 数部分的数。在 C 语言中,根据数值的取值范围,可以将整型定义为短整型(short int)、基本整型(int) 和长整型(long int)。下图列举了整数类型的长度及其取值范围。
具体案例:
#include <stdio.h>
int main()
{
int a = 12345;
long b = -23456 ,sum1;
unsigned int c = 32800, sum2;
sum1 = b - a;
sum2 = c - b;
printf("sum1=%ld,sum2=%u\n",sum1,sum2);
return 0;
}
输出结果:
2、实型变量 实型变量也可以称为浮点型变量,浮点型变量是用来存储小数数值的。在 C 语言中,浮点型变量分为 两种:单精度浮点数(float)、双精度浮点数(double),但是 double 型变量所表示的浮点数比 float 型变 量更精确。下表列举了两种不同浮点型数所占用的存储空间大小及取值范围。
表中列出了两种浮点数类型变量所占的空间大小和取值范围。在取值范围中,E 表示以 10 为底 的指数,E 后面的“+”号和“-”号代表正指数和负指数,例如,1.4E-45 表示 1.4*10-45。为了让读者更好 地理解浮点型数据在内存中的存储方式,接下来以单精度浮点数为例进行详细讲解,
注意:在 C 语言中,一个小数会被默认为 double 类型的值,因此在为一个 float 类型的变量赋值时需要注意 一点,所赋值的后面一定要加上字母“F”(或者小写“f”),而为 double 类型的变量赋值时,其所赋值后 面的字符“D”(或小写“d”),可以省略。
3、字符型变量
字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。 在给字符型变量赋值时,需要用一对英文半角格式的单引号(' ')把字符括起来。
严格来说,字符类型也是整型类型。具体见下图:
#include <stdio.h>
int main()
{
char ch1 = 'A';
char ch2 = 65;
printf("%c\n", ch1);
printf("%c\n", ch2);
return 0;
}
运行结果:
字符在计算机之中的存储是以ASCII码的方式存储的,详情见附录ASCII表。
ASCII表地址;http://tool.oschina.net/commons?type=4
除普通字符外,有些字符无法从键盘直接输入,故定义了一种新的方式--转义字符,列举部分转义字符如下表:
3.运算符
常见的运算符可分为六大类。
(1)算术运算符
在进行自增(++)和自减(--)的运算时,如果运算符(++或--)放在操作数的前面则是先进行自 增或自减运算,再进行其他运算。反之,如果运算符放在操作数的后面则是先进行其他运算再进行自增或 自减运算。
请仔细阅读下面的代码块,思考运行的结果。
int num1 = 1;
int num2 = 2;
int res = num1 + num2++;
printf("num2=%d" + num2);
printf("res=%d" + res);
上面的代码块运行结果为:num2=3,res=3,具体分析如下:
第一步:运算 mum1+mun2++的结果,此时变量 mun1,mum2 的值不变。
第二步:将第一步的运算结果赋值给变量 res,此时 res 值为 3。
第三步:mum2 进行自增,此时其值为 3。
(2)赋值运算符
(3)比较远算符
(4)逻辑运算符
三种逻辑运算符的优先级从高到低依次为:!、&&、||
(5)位运算符
(6)sizeof运算符
同一种数据类型在不同的编译系统中所占空间不一定相同,例如,在基于 16 位的编译系统中,int 类 型占用 2 个字节,而在 32 位的编译系统中,int 类型占用 4 个字节。为了获取某一数据或数据类型在内存 中所占的字节数,C 语言提供了 sizeof 运算符,使用 sizeof 运算符获取数据字节数,其基本语法规则如下 所示:
sizeof(数据类型名称);
或 sizeof(变量名称);
4.运算符的优先级
下表中列出了C 语言中运算符的优先级,数字越小优先级越高。