购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2-3 基本数据形态

C语言的基本数据形态有以下几种。

(1)int:整数。

(2)float:单精度浮点数。

(3)char:字符。

(4)double:双倍精度浮点数。

2-3-1 整数

有时可在整数前面加上一些限定字,例如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-2 字符

字符是指一个单引号之间的符号,可以参考实例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字符变量。

2-3-3 浮点数

程序设计时,如果需要比较精确地记录数值的变化,需使用小数点以下时,则建议使用浮点数声明此变量,例如,平均成绩、温度、里程数等。在其他高级语言中,人们习惯称此数为实数。浮点数有两种: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)],则就常常将浮点数改成双倍精度浮点数,以获得较精确的程序设计结果。

2-3-4 sizeof( )函数

这个操作主要是供程序设计师算出任何类型的数据所占用的内存,以字节(byte)为单位,它的使用语法如下:

sizeof(某个数据形态)

实例: 有一C语言指令如下:

n=sizeof(char);

由于char字符定义是一字节(byte),所以执行完后,n的值是1。

这是一个非常实用的函数,主要可以了解目前数据形态的字节(byte)大小。在本章前面笔者一直强调,不同的编译程序对于int设定多少位空间有不同的设定,可以用sizeof操作数了解目前所使用编译程序的设定。

程序实例 ch2_3.c:列出数据形态所占内存空间的大小。

2-3-5 字符串数据形态

一般字符串指的是在两个双引号中的任意字符。例如:

"hello, How are you?"

若是双引号中没有字符,称为空字符串。

C语言编译程序在将字符串存入内存时,会自动将‘\0’加在字符串最后,‘\0’又称字符串结尾字符,表示字符串结束,因此,在存放字符串时,不必将‘\0’字符放入字符串内。

实例: 假设有一字符串是“hello!”,则实际内存存储此字符串的图形如下所示。

另外,双引号并不是字符串的一部分,如果有一个字符串如下:

He say, "Hello!,"

则此字符串的表示法如下:

"He say, \"Hello!,\""

也就是在表示此类字符串时,将‘\’放在双引号字符前就可以了。至于更详细的字符串和实例说明,将在第8章解说。 6i7iYPPtLmqffh+tB+wKeZS6yrhEOS9WlHSvl+B1unZBwJjgSoCfAZkFf/2/1OhO

点击中间区域
呼出菜单
上一章
目录
下一章
×