数值类型
出处:按学科分类—工业技术 企业管理出版社《工程师手册》第847页(3976字)
1.变量
C程序在使用变量之前,必须对变量进行声明,根据数值的存贮格式(浮点格式或整数可靠式)和精度(如单精度浮点,双精度浮点),可以有若干种数值类型。下面的程序例子说明了五种不同数值类型的使用:
main()
int i; /*size dependent on implementation*/
short j; /*16 bit integer*/
long k; /*32 bit integet*/
float a: /*single precision floating point*/
double b; /*double precision floating point*/
k=72000;
j=k;
i=k;
b=0.1
a=bprintf(“\n%ld %d %d\n%20.15f”,k,j,i,b,a);
本例说明了三种整数类型(int,short int和long int)和两种浮点类型(float和double)。这五种类型的实际的大小(以存贮相应变量占用的字节数计)与语言的具体实现有关,但必须保证短整数的长不超过长整数,双精度浮点数的大小是单精度浮点数的两倍。声明为int的整数变量,其大小依赖于编译器的实现,一般为目标机器最便于处理的大小,以使程序对整数的使用最为有效。但是,如果整数表示的大小在一个程序中很重要(通常都是如此),那么变量声明为int可能使同一程序在不同机器上具有不同的表现。例如,在16位机上,前述程序的运行结果为:
72000 6464 6464
0·100000000000000
0.10000001490116
但在32位机上(整数int为32位),其输出结果为:
72000 6464 72000
0.100000000000000
0.10000000149011
注意在以上两种情况下,short变量k和long变量j(显示结果的前两个数)的值不变,而第三个数,即int变量i的值却不相同。在两次运行中,j的值6464都是通屏蔽32位变量r的高16位得到的。0.1的32位浮点表示,其精度为8位十进制数。
因此,要使程序真正可移植,程序中就只能包括short int和long int变量。除了上述五种类型之外,三种整数前加上unsigned可以声明为无符予数。而且,通过将一个变量声明为char(signed或unsigned),可使该变量只有一个字节长,这将在下一节关于文本数据的内容中详细讨论。表3·3·1-1给出了不同变量类型有32位机(如VAX机)和16位机(如IBM PC)上的典型大小和表示范围。
3.3.1-1 C在两种机器上的变量表示范围
2.数组
几乎所有高级语言允许定义给定数据类型的索引表。通常称为数组。在C语言中,通过将数组的元素个数放在数组名后的括号中,所有数据类型都可以声明相应的数组。在数组名后增加多个括号,每个括号中写明相应维数,就能定义多维数组。一个N维数组可定义如下:
type name[size1][size2]…[sizeN];
例如,下述语句都是合法的数组定义;
unsigned int list[10];
double input[5];
short int x[2000];
char inpng-buffer [20];
unsigned char image[256][256]
int magrix[4][3][2];
注意图像的数组定(unsigned char image[256])。[256]说明了一直8位的256×256图像平面,图像的灰度级表示为0到255。类似地最后一个定义声明了一个三维矩阵。C与它语言的区别之一是,C通过方括号中的下标引用数组元素。因此,前面定义的图像数组,其元素将以image[i][j]的形式引用,其中i和j直表示行下标和列下标。注意在C语言中,数组第一个元素的下标为0,最后一个元素的下标为N-1,N是数组在相应维上的大小,因此,对于上面定义的大小为5的一维数组input[0]=1.3;第五个元素的赋值形式为input[4]=1.3,而input[5]=1.3是错误的。
在声明数组时,可以对数组进行初始化。初始值放在一个或多个大括号内,值与值之间用逗号隔开。例如,一个名为vector的一维数组可声明并初始化如下:
int vector[]={1,2,3,5,8,13}
一个包含六个双精度浮点数的二维数组可用下述句声明并初始化:
doublea[3][2]={
{1.5,2.5},
{1.1e-5,1.7es},
{1.765,12.678},};
注意用逗号分开的三对内部大括号分别表示矩阵a的三行,而整个矩阵初始化语句必须以分号结束。
3.文本数据类型:字符的字符串
C语言中的文本(text)通过声明为char的字符的数组进行处理。char变量既可存贮数值(声明为unsigned char的变量可存贮。到255间的数值,也可以存贮字符,单个字符以字母外加单引号表示(如‘Z’表示Z的8位常量)。
字符的串通过外加双引号表示,如“This is a string”。当编译器遇到包含该字符串的语句时,它将“This is a string”赋给一个长度为17字节的存贮区域,每个字节依次初始化为串中相应的一个字符,第17个字节为字符rull(其ACⅡ码为0),然后编译器利用字符串的起始地址。例如,语句printf(“This is a string”)分配17个字节并将字符串的起始地址(即字符T的地址)传送显示设备,直到遇到字符串尾的null字符。所以C语言中的串是以null结束的。
字符串中不能含有非打印字符,如回车,换行,tab以及响铃符等。为了在串的存贮区域中存入这些特殊字符。它们在C语言中的表示如下(均以反线找打头):
\\ 表示反射线(\)
\′ 表示撇号
\″ 表示引号
\n 表示回车加换行(newline)
\ 表示水平制表符
\b 表示退符
\r 表示回车符
\f 表示清屏符
\xxx 表示ASCII码为xxx的字符,其中xxx是1到3位八进制数字(0-7)
\xHHH 表示ASCⅡ码为HHH的字符,其中HHH是1到3位七六进制数字(0-9,A-F)