数据以一定的类型和格式存储在计算机中,数据的类型可以是整数、实数、字符型,也可以是图形、图像、声音、视频。在C语言中,数据类型可分为基本数据类型、构造数据类型(包括数组、枚举类型、结构体和联合体)、指针类型、空类型四大类。本节介绍C语言的基本数据类型:整型、浮点型和字符型。C语言中数据还有常量和变量之分,常量是指在程序运行过程中其值不能被改变的量,而变量则可以改变。
2.2.1 整型
整型常量即整常数,C语言中常用的整型常量有:十六进制、八进制和十进制。
十六进制整常数以0x为前缀,其数字取值为0~9,A~F(或a~f,分别对应数字10~15)。如0x1A6,其对应的十进制值为1 × 162 + 10 × 161 + 6 × 160 = 422。
以下各数是合法的十六进制整常数。
0x25(十进制为37),0xB1(十进制为177),0xFFFF(十进制为65535)。
以下各数不是合法的十六进制整常数:
12(没有前缀0x,计算机将视为十进制的12),0x12G(G不是合法的十六进制数码)。
八进制整常数必须以0为前缀,其数字取值为0~7。如015,其对应的十进制数为1 × 81 + 5 × 80 = 13。
以下各数是合法的八进制整常数。
012(十进制为10),0101(十进制为65),01000(十进制为512)。
以下各数不是合法的八进制数:
256(无前缀0),03A2(包含了非八进制数码)。
十进制整常数没有前缀,其数字取值0~9。
以下各数是合法的十进制整常数。
237,65535,1688。
以下各数不是合法的十进制整常数。
025(不能有前导0),88D(含有非十进制数码)。
C语言中的变量遵守“先定义后使用”的规则。下面定义了一个名为num的整型变量,之后赋值100,然后又改变其值为200。
int num;
num=100;
num=200;
int是整型变量的基本类型,整型变量还有短整型(short int或short)和长整型(long int或long),它们的不同之处在于变量在内存中存储时所占用的字节数,通常在32位机上短整型为2字节即16位,基本整型和长整型占用4字节即32位。
例如,有以下语句,定义了一个短整型变量i,并在定义时就赋予初始值10。
short int i=10;
数据在内存中是以二进制的形式存放的,十进制数10对应的二进制数为1010。图2-1显示了变量i在内存中的存放,最高位为符号位,0表示是正数,1表示为负数。

图2-1 变量i的内存示例图
一个短整型short int变量的值的范围为−215~215−1,即−32768~32767。短整型所表示的数是很有限的,实际应用中通常使用int型,其值范围为−231~231−1,即−2147483638~2147483637。在一些实际应用中,变量的值常常为正数,如图书馆管理系统中的图书总数,企业信息系统中的公司职员数等。为了充分利用变量的表示范围,此时可以将变量定义为无符号类型。加上修饰符unsigned就可以定义无符号变量,如unsigned short int i,定义了一个无符号短整型变量i;unsigned int j定义了一个无符号整型变量j。默认情况下,定义的变量是有符号的,即表示的数可正可负,有符号变量也可以加上修饰符signed,但通常情况下不加。无符号短整型由于最高位不再存储符号信息,其值范围为0~216−1,即0~65535。相应地,无符号整型所表示的数的范围0~232−1,即0~4294967295。
C语言中并未规定各个数据类型所占内存的字节数,具体如何实现由各计算机系统决定。有的微机上短整型和整型都是16位,而长整型位32位。所占内存的字节数可以用求字节数的运算符号sizeof来确定。例2-2程序可以用于确定各数据类型所占内存的字节数。
例2-2
#include <stdio.h>
int main( )
{
short int i;
int j;
long int k;
int a,b,c;
a=sizeof(i);
b=sizeof(j);
c=sizeof(k);
printf("a is %d\n", a);
printf("b is %d\n", b);
printf("c is %d\n", c);
}
程序说明。
(1)允许在一条语句中定义多个相同数据类型的变量,如“int a,b,c;”,各变量名之间用逗号间隔。数据类型说明符(如int)与变量名之间至少用一个空格隔开。
(2)“a = sizeof(i);”语句中sizeof(i)用于求出变量i所占内存的字节数,并把该数值赋给变量a。
(3)“printf(“a is %d\n”, a);”语句中的“\n”为换行符,表示另起一行开始输出,它是转义字符,不会在屏幕上原样输出。
新建一个名为test.c的文件,输入例2-2源程序,保存后进行编译,并运行,结果如下所示:
$ gcc –o test test.c
$ ./test
a is 2
b is 4
c is 4
2.2.2 浮点型
1.浮点型常量
浮点型常量即实数,主要有两种表示形式。
(1)十进制小数形式。它由正负号、数字、小数点组成,其中小数点是必须有的,如3.45、0.25、.78、96.、−12.5、0.0都是合法的。
(2)指数形式。一般形式为xEy或xey,表示x × 10y,其中y必须是整数,如:2.15e1(即21.5),.005E2(即0.5),−3.6e3(即−3600)。
2.浮点型变量
浮点型变量主要有单精度(float型)和双精度(double型)两种,一般它们在内存中分别占4个字节和8个字节。如下所示,定义了一个单精度浮点型变量i和一个双精度浮点型变量j。
float i;
double j;
单精度浮点型变量的取值范围约在−10−37~1038,有效数字是7位。双精度浮点型变量的取值范围约在−10−307~10308,有效数字是16位。一般在使用中,单精度浮点型即float型已足够,但为了增加有效位数则可以使用double型。下面以例2-3来说明有效位数的概念。
例2-3
#include <stdio.h>
int main( )
{
float a=88888.88888; /*整数部分5位,小数部分5位*/
double b=8888888888.888888888; /*整数部分10位,小数部分9位*/
printf("a is %f",a);
printf("b is %f",b);
}
程序说明。
1、(1、)本程序定义了两个浮点型变量,分别为单精度和双精度,并赋予了初值。
2、(2、)“%f”表示此处输出一个浮点型变量,且小数点后最多输出6位。
编译并运行程序结果如下所示:
$ gcc –o test test.c
$ ./test
a is 88888.890625
b is 8888888888.888889
在本例中,由于a是单精度浮点型,有效位数只有7位。而整数已占5位,故小数点两位之后均为无效数字。小数部分的9是四舍五入的结果,它是最后一位有效位。同样的,b是双精度型,有效位为16位。小数部分的9也是四舍五入的结果,它也是最后一位有效位。%f规定小数点后最多保留6位,所以小数部分只输出了6位。
2.2.3 字符型
1、.字符型常量
字符常量是用单引号括起来的一个字符。如’a’,’b’,’=’,’5’,’?’都是合法字符常量。
注意:在C语言中,’a’和’A’是不同的字符常量,’5’是一个字符常量而5是一个十进制的整数。
2.转义字符
转义字符是一种特殊的字符常量。转义字符以反斜扛“\”开头,后跟一个或几个字符。转义字符具有特别的含义,不同于字符原有的意义,故称“转义”字符。例如,在前面程序中printf函数中用到的“\n”就是一个转义字符,其意义是“回车换行”。转义字符主要用来表示那些用一般字符不便于表示的控制代码,表2-1为常用转义字符。
表2-1 常用转义字符表
|
字 符 形 式 |
含 义 |
|
\n |
换行,将当前位置移到下一行开头,相当于按Enter键 |
|
\t |
跳到下一个tab位置,相当于按Tab键 |
|
\b |
退格,将当前位置移到前一列,相当于按BackSpace键 |
|
\\ |
反斜扛字符\ |
|
\’ |
单引号字符’ |
|
\” |
双引号字符” |
|
\0 |
空字符,它将用在字符串中 |
|
\ddd |
1到3位的八进制数所代表的字符,如\101代表字符A |
|
\xhh |
1到2位的十六进制数所代表的字符,如\x41代表字符A |
3.字符变量
字符型变量由关键字char来定义,如下所示:
char c1,c2=’A’;
定义了两个字符型变量c1、c2,并为c2赋予了初值,即字符’A’。
一个字符型变量在内存中占一个字节(8位),只能存放一个字符,如’a’,’=’,’\n’,’\n’是一个转义字符。字符是以ASCII码的形式存放在内存单元中的,每个字符对应一个ASCII码,如字符A对应的ASCII码为65,字符a对应97,字符b对应98。因此,字符型变量的值实质上是一个8位的数值,其值范围为−27~27−1即−128~127。字符型变量char也可以加上修饰符unsigned变为unsigned char,它表示一个8位的无符号整数,其值取值范围为0~28−1即0~255。
由于字符在内存中以ASCII码的形式存放,而ASCII码实际上就是一个整数,因此字符型变量可以与整型变量进行运算。例2-4将实现它们之间的转换。
例2-4
#include<stdio.h>
int main( )
{
int c1,c2;
char c3;
c1='a'-'A';
c2='b'-'B';
c3='c'-32;
printf("c1 is %d and c2 is %d\n",c1,c2);
printf("c3 is %d and %c\n",c3,c3);
}
程序说明。
1、(1)程序首先定义两个整型变量c1、c2,然后再定义一个字符变量c3。
2、(2)将字符a与A的ASCII码相减,并把结果赋给c2。字符a与A的ASCII码分别是97和65,因此c1的值为32。之后把字符b与B的ASCII码相减,并把结果赋给c2。字符b与B的ASCII码分别为98和66,因此c2的值也为32。事实上,对于26个英文字母,其大小写的ASCII码之差都是32,因此大小写之间的转换是很容易的。
3、(3)将字符c减去32,把值赋给c3。c3的值是字符C的ASCII码,即67。
4、(4)程序第一行打印出c1和c2的值。第二行以整型和字符型两种方式打印出c3的值。“%c”表示该位置输出的是一个字符型变量的值。
运行结果如下:
c1 is 32 and c2 is 32
c3 is 67 and C
4.字符串常量
字符串常量是由一对双引号括起的字符序列,例如:
"China","Welcome to Linux\n","How are you?"。
字符串常量在内存中存储时,每个字符占用一个字节的内存空间,系统自动在字符串尾部加上一个字符’\0’,以标识这个字符串的结束。字符串China在内存中的存储形式如图2-2所示。
![]()
图2-2
事实上,字符是以ASCII码的二进制形式存放在内存中的。例如,字符a的ASCII码的二进制表示是01100001,其在内存中存储形式如图2-3所示。
![]()
图2-3
5.符号常量
常量也可以有一个名字,这就是符号常量。符号常量的用法如例2-5所示。
例2-5
#include <stdio.h>
#define PI 3.1415926
int main( )
{
float r=2.56;
float l,s;
l=2*PI*r;
s=PI*r*r;
printf("l=%f\n",l);
printf("s=%f\n",s);
}
程序说明。
该程序的功能是输出一个半径为2.56的圆的周长和面积。程序在第二行使用预编译命令“#define”定义了一个符号常量PI,其值为3.1415926。在这个程序中,凡是PI就是指3.1415926。在程序中,使用一个符号来代替一个常数,至少有以下优点。
(1)使程序更清晰,更可读。在阅读大量的程序代码时,数字本身并不能说明其意义。如果定义为符号常量,程序的可读性就增强了。
(2)程序的修改更方便。试想,如果该程序有许多地方都用到π这个值,而π的值只要3.14就可以了,那么我们只要在程序的开始把PI定义为3.14即可,而不需要在程序里找到每个π,然后修改它的值。






