首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

数据以一定的类型和格式存储在计算机中,数据的类型可以是整数、实数、字符型,也可以是图形、图像、声音、视频。在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;

单精度浮点型变量的取值范围约在−1037~1038,有效数字是7位。双精度浮点型变量的取值范围约在−10307~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即可,而不需要在程序里找到每个π,然后修改它的值。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论