C语言的基本数据形态有以下几种。
(1)int:整数。
(2)float:单精度浮点数。
(3)char:字符。
(4)double:双倍精度浮点数。
有时可在整数前面加上一些限定字,例如short、long、unsigned和signed。所以事实上整数的数据形态有9种,如下所示。
整数相关概念表
注1 8位(bit)称为一字节(byte),早期C语言的整数长度是2字节,也可称16位。早期16位的计算机,是用16位长度当作整数,32位计算机则是用32位长度当作整数,至于64位计算机是用32位或64位当作整数长度,依实际操作而定。
注2 笔者目前的计算机在Dev C++或是Visual C++环境,整数(int)长度是4字节,也可称32位。同时笔者计算机在Dev C++或是Visual C++环境,长整数(long)长度也是32位,但是短整数则仍是2字节,也就是16位。
声明整数需使用int关键词,其语法如下:
int 整数变量;
也可以用整数相关概念表中的其他关键词,声明其他整数类型。此外,还可以在声明整数时设定整数变量的初值。
实例: 声明整数变量i的初值是1。
int i=1;
在上述整数声明中,如果加上“unsigned”,代表此整数一定是正整数,若以“short int”及“unsigned short int”声明,则内存内容与实际数值关系如下所示。
值得注意的是,短整数short声明,由于所占内存空间是16位,因此,其最大值是32767。如果指令如下:
int i=32767; i=i+1;
经上述指令后,i并不是32768,而是-32768,通常又称此种情况为溢位(overflow)。程序设计时为了避免这种情形发生,一定要小心地选择整数长度。
另外,一般整数由于所占内存空间是32位,因此,其最大值是2147483647。假设指令如下:
int i=2147483647; i=i+1;
经上述指令后,i并不是2147483648,而是-2147483648,发生溢位。不过目前在编译程序的主流中,对于整数int声明一般皆是给予32位的空间。
为了避免搞混,也可以直接使用short(短整数)与long(长整数)声明,如下:
short int i; long int j;
或是省略int,用下列方式声明:
short I; long j;
上述将i声明为短整数,所占空间是16位,j则声明为长整数,所占空间是32位。
程序实例 ch2_1.c:用程序真正了解短整数溢位的概念。
上述程序完全验证了前面短整数的概念,原i1是32767,常理推知,若将i值加1,i位应变成32768,但由程序可知i值变成-32768,这就是溢位。
注1 以上程序第11行的printf( )是输出函数,“%d”是整数输出的格式字符串,相当于控制i1变量使用整数格式输出,第3章会做更完整的说明。
注2 变量声明后,如果未设定变量值,此变量内容不一定是0,而是原先在内存的残值,所以使用前要特别留意。
程序实例 ch2_1_1.c:认识内存的残值,这个程序声明了3个整数变量,没有设定变量内容,输出时i2结果是1,这个1就是内存残值。
因为是内存的残值,每台计算机使用状况不同,读者可能会获得不一样的结果。
程序实例 ch2_2.c:用程序真正了解整数及长整数溢位的概念。
上述程序完全验证了前面整数及长整数的概念,原i1是2147483647,常理推知,若将i值加1,i位应变成2147483648,但由程序可知i值变成-2147483648,这就是溢位。
字符是指一个单引号之间的符号,可以参考实例2,例如:
‘ ’
字符也可以用码值代表,可以参考实例3。
声明字符变量可以使用char关键词,每一个char所声明的变量占据的内存空间是8位,也可以称一字节(byte)。
因为2 8 =256,所以每个字符char可代表256个不同的值。在C语言中,这256个不同的值是根据ASCII码的值排列的,而这些码的值包含小写字母、大写字母、数字、标点符号及其他一些特殊符号,读者可以参考附录A(可在前言最后扫码下载)。声明字符变量须使用char关键词,其语法如下:
char 字符变量;
实例1: 声明字符变量single_char,其声明方式如下:
char single_char;
实例2: 声明字符变量single_char,并将其值设定为“a”:
char single_char='a';
实例3: 声明字符变量single_char,将其码值设定为97:
char single_char=97;
由于值97经查ASCII码得知是a,所以实例2和实例3代表意义是一样的。
另外,C语言中,有一些无法打印字符,例如,“\0”,虽然在单引号中有“\”和“0”,但是它们合并起来只能算是一个字符,称这些字符为逸出(escape)字符,如下是这些字符。
ASCII的特殊字符
程序实例ch1_1.c中笔者有说可以使用“\n”字符换行输出,其实就是使用上述ASCII特殊字符的概念。
此外,也可以利用下列两种特殊字符,处理所有适用于IBM PC的ASCII字符:
'\xdd':x后面的两个d各代表一个十六进制数值,因此可代表256个ASCII字符。
'\ddd':三个d各代表一个八进制数值,因此也可代表256个ASCII字符。
注 默认char所声明的变量是8位,但是适用UNIX操作系统的机器,也有以16位存储char字符变量。
程序设计时,如果需要比较精确地记录数值的变化,需使用小数点以下时,则建议使用浮点数声明此变量,例如,平均成绩、温度、里程数等。在其他高级语言中,人们习惯称此数为实数。浮点数有两种:float是浮点数;double是双倍精度浮点数。常用的两种浮点数的相关数据如下所示。
浮点数相关概念表
声明浮点数的关键词是float,声明双倍精度的浮点数是double,声明的语法如下:
float 变量名称; double 变量名称;
实例1: 请声明一个浮点数变量average,则其声明如下:
float average;
double又被称为双倍精度浮点数,从浮点数相关概念表可知它的容量是浮点数的一倍。声明浮点数时也可以设定初值,可以参考下列实例。
实例2: 请声明ave变量为浮点数,值是76.42。
float ave=76.42;
有时看别人程序时会看到将上述声明改成如下所示:
float ave=76.42F;
上述F再一次标明ave是浮点数变量。C语言的编译程序有许多,若没有标准F或f,有的编译程序会强制将ave变量编译成双倍精度浮点数。其实对于一般程序设计师而言,浮点数的使用与双倍精度浮点数没有太大差别,但是如果需要使用C语言解决数值问题或高精密度的工程问题[例如有限元素法(Finite Elemen)],则就常常将浮点数改成双倍精度浮点数,以获得较精确的程序设计结果。
这个操作主要是供程序设计师算出任何类型的数据所占用的内存,以字节(byte)为单位,它的使用语法如下:
sizeof(某个数据形态)
实例: 有一C语言指令如下:
n=sizeof(char);
由于char字符定义是一字节(byte),所以执行完后,n的值是1。
这是一个非常实用的函数,主要可以了解目前数据形态的字节(byte)大小。在本章前面笔者一直强调,不同的编译程序对于int设定多少位空间有不同的设定,可以用sizeof操作数了解目前所使用编译程序的设定。
程序实例 ch2_3.c:列出数据形态所占内存空间的大小。
一般字符串指的是在两个双引号中的任意字符。例如:
"hello, How are you?"
注 若是双引号中没有字符,称为空字符串。
C语言编译程序在将字符串存入内存时,会自动将‘\0’加在字符串最后,‘\0’又称字符串结尾字符,表示字符串结束,因此,在存放字符串时,不必将‘\0’字符放入字符串内。
实例: 假设有一字符串是“hello!”,则实际内存存储此字符串的图形如下所示。
另外,双引号并不是字符串的一部分,如果有一个字符串如下:
He say, "Hello!,"
则此字符串的表示法如下:
"He say, \"Hello!,\""
也就是在表示此类字符串时,将‘\’放在双引号字符前就可以了。至于更详细的字符串和实例说明,将在第8章解说。