为什么需要在进行计算机编程前提出数据类型这一概念?所谓类型,是指对数据分配存储单元的安排,包括存储单元的长度、字节数以及数据的存储形式。不同的类型分配不同的长度和存储形式。与汇编语言相比,C语言引入数据类型这一概念,限制了人的操作,从而降低操作难度、降低出错率。而且,定义了数据类型之后又定义了数据类型之间的各种运算,这样对编程人来说就会方便很多,如果不定义数据类型,那么数据之间的差别就只有位不同而已。
C语言允许使用的数据类型如图2.3所示。
图2.3 C语言所允许数据类型
其中,注意事项如下:
①算术类型:基本类型(整型和浮点型)和枚举类型变量的值都是数值,因此统称为算术类型。
②纯量类型:算术类型和指针类型变量的值都是以数字表示的,因此统称为纯量类型。
③整数类型:枚举型是程序中用户定义的整数类型。
④组合类型:数组类型和结构体类型统称为组合类型,共用体不属于组合类型,因为在同一时间内只有一个成员具有值。
1.整型数据
(1)整型常量
C语言中所称的整型常量即为整数,可以用3种形式表示:十进制、八进制和十六进制。
(2)整型变量
C语言中用来保存整数的变量为整型变量。一般用类型说明符int定义和说明整型变量。
①整型数据在内存中的存放形式
Visual C++为每一个整型数据分配4个字节(32位),数据在内存中以二进制形式存放(事实上以数据的补码形式存放)。
例如:
定义一个整型变量a=6,则数据在内存中的存放形式如图2.4所示。
图2.4 数据在内存中的存放形式
②整型变量的分类
整型变量的基本类型为int型,若通过加上修饰符,可定义更多的整型数据类型:
a.基本整型(int),占据4个字节内存空间,取值范围为-2147483648~2147483647。
b.短整型(short int),占据2个字节内存空间,取值范围为-32768~32767。
c.长整型(long int),占据4个字节内存空间,取值范围为-2147483648~2147483647。
d.双长整型(long long int),占8个字节空间,但是目前许多C编译系统尚未实现。
另外,因为变量值在存储单元中都是以补码形式存储,所以有时存储单元中的第一个二进制代表符号又可根据是否有符号整形变量可以另分为带符号(或有符号)(signed,默认,可省略)和无符号(unsigned)两类。带符号整型数的存储单元的最高位是符号位(0表示正,1表示负),其余为数值位。无符号整型数的存储单元的全部二进制位用于存放数值本身而不包含符号。
综上所述,C语言中有6种整型变量,如表2-7所示。
表2-7 C语言的整型变量类型
2.字符型数据
(1)字符常量
正如前面所描述的,字符常量在保存时是通过保存其相应的ASCII码实现的,所有的ASCII码都可以用“\”加数字来表示。转义字符为C语言中定义了一些字母前加“\”来表示常见的、不能显示的ASCII字符。
通过对表2-1常用转义字符一览表,进行分析和总结,转义字符有以下3种用法:
①控制字符的表示。
例如:
a.′\n′:换行。
b.′\t′:水平制表。
c.′\r′:回车。
d.′\b′:退格。
②特殊字符的表示。
例如:
a.′\′:单引号。
b.′\"′:双引号。
c.′\\′:反斜杠。
③所有字符的表示,只需提供要表示字符的ASCII码。
a.′\ddd′:ddd指要表示字符的ASCII码的1~3位八进制数,例如′\101′表示字符′A′、′\012′表示字符′\n′。
b.′\xhh′:hh指要表示字符的ASCII码的1~2位十六进制数,例如′\x41′表示字符′A′、′\x0A′表示字符′\n′。
(2)字符变量
字符变量是用来存放字符数据的,每个字符变量只能存放一个字符。所有编译系统都规定以一个字节来存放一个字符,或者是一个字符变量在内存中占一个字节。
字符数据在内存中是将字符的ASCII码(常用字符与ASCII代码对照表,详见附录)以二进制形式存储的,占用1个字节,如图2.4所示。
图2.4 字符数据在内存中的存储
可见,字符数据以ASCII码存储的形式与整数数据的存储形式类似,这使得字符型数据和整型数据之间在一定数值范围内可以通用,具体表现为:
①可以将整型量赋值给字符变量,也可以将字符量赋值给整型变量。
②可以对字符数据进行算术运算,相当于对它们的ASCII码进行算术运算。
③一个字符数据既可以以字符形式输出(ASCII码对应的字符),也可以以整数形式输出(直接输出ASCII码)。
需要注意:尽管字符型数据和整型数据之间可以通用,但是字符型只占1个字节,即如果作为整数,则使用范围为0~255(无符号)或-128~127(有符号)。
a.字符型数据向整型数据转换过程,举例如下:
【例2.6】用多种表示方法表示字符′a′并输出,并分别给赋以整数(字符型、整型数据通用)。
程序内容如下:
1 /*用多种表示方法表示字符′a′并输出*/
2 #include<stdio.h>
3 intmain()
4 {
5 charc1=′a′; //字符′a′的表示法1
6 charc2=′\x61′; //字符′a′的表示法2
7 charc3=′\141′; //字符′a′的表示法3
8 charc4=97; //字符′a′的表示法4
9 charc5=0x61; //字符′a′的表示法5
10 charc6=0141;
11 printf("\nc1=%c,c2=%c,c3=%c,c4=%c,c5=%c,c6=%c\n",c1,c2,c3,c4,c5,c6);
12 printf("c1=%d,c2=%d,c3=%d,c4=%d,c5=%d,c6=%d\n",c1,c2,c3,c4,c5,c6);
13 /*字符′a′的整数输出*/
14 getchar();(www.xing528.com)
15 return0;
16 }
程序结果如图2.5所示:
图2.5 例2.6程序结果图
b.整型数据转换字符型数据的过程经简化后可表示为图2.6。
图2.6 整型数据转换字符型数据的过程
3.浮点型数据
(1)浮点型常量
浮点型常量有两种表示形式:十进制小数形式和指数形式。
正如前面所描述的,用指数形式表示实数时,e前一定要有数字(尾数),e后一定要有整数(指数),尾数和e之间不能有任何分隔符。指数形式的规范化形式为:尾数中小数点左边有且只能有一位非零数字。当要用指数形式输出一个实数时,就是按规范化指数形式输出。
在用指数形式表示实数时要注意以下几点:
①字母e或E之前必须有数字,e后面的指数必须为整数。
例如:e3、2.1e3.5、.e3、e都不是合法的指数形式。
②规范化的指数形式。在字母e或E之前的小数部分,小数点左边应当有且只能有一位非0数字。用指数形式输出实数时,将按规范化的指数形式输出。
例如:2.3478e2、-3.0999E5、6.46832e12都属于规范化的指数形式。
③浮点型常量都是双精度类型的,如果要指定它为单精度,可以加后缀f(浮点型数据类型参考浮点型变量部分说明)。
(2)浮点型变量
①浮点型数据在内存中的存放形式
一个浮点型数据(float类型)一般在内存中占4个字节(32位)。与整数存储方式不同,浮点型数据是按照指数形式存储的。系统将浮点型数据分为小数部分和指数部分,分别存放。浮点型数据的存放如图2.7所示。
图2.7 浮点型数据在内存中的存放
标准C语言没有规定用多少位表示小数部分,多少位表示指数部分,其由C编译系统自定。
例如:
很多编译系统以24位表示小数部分,8位表示指数部分。
小数部分占的位数多,则浮点型数据的有效数字就多,精度也高;指数部分占的位数多,则表示的数值范围大。
②浮点型变量的分类
C语言将浮点型分为单精度浮点型(float)、双精度浮点型(double)和长双精度浮点型(long double)三类,但是并没有规定每种数据类型的长度、精度和数值范围。表2-8列出了Visual C++2010(学习版)中浮点型数据的长度、精度和数值范围,不同的系统可能会有差异。
表2-8 C语言的浮点型变量类型
③浮点型数据的舍入误差
需要注意:这里所强调的浮点型数据的舍入误差是和整型数据的溢出进行的对比。浮点型变量是用有限的存储单元存储的,因此提供的有效数字是有限的,在有效位以外的数字将被舍去,由此可能会产生一些误差。
【例2.7】所谓浮点型数据的舍入误差即浮点型变量有效数字后面的数字无意义,以如下实例为例。
程序内容如下:
1 #include<stdio.h>
2 int main()
3 {
4 float a,b;
5 a=666.888e6;
6 b=a+10000;
7 printf("a=%f,b=%f\n",a,b);
8 printf("a=%e,b=%e\n",a,b);
9 return 0;
10 }
程序结果如图2.8所示:
图2.8 例2.7程序结果图
【例题中关键问题说明】
由于浮点型存在舍入误差,所以使用时要注意:
(1)不要试图用一个浮点型精确表示一个整数,因为浮点型数是不精确的。
(2)浮点型一般不判断“相等”,而是判断接近或近似。
(3)避免直接将一个数值很大的实数与一个很小的实数相加、相减,否则会“丢失”数值小的实数。
()根据实际要求选择使用单精度还是双精度。
综上所述,学习C语言中的数据类型时,须注意以下几点:
①不同的数据类型有不同的取值范围。
例如:有符号的整型数取值范围为-2147483648~2147483647,即-231~(231-1),单精度浮点型数的取值范围为-3.4e38~3.4e38。
②不同的数据类型有不同的操作。
例如:整型数据可以有取余操作,浮点型数据却没有;整型、字符型数据可以进行判断相等与不相等的运算,而浮点型数据则不行。
③不同的数据类型即使有相同的操作有时含义也不同。
例如:指针数据自增1与整数自增1含义是不同的。
④不同的数据类型在计算机中可能出现的错误不同。
例如:整型数的溢出错误,单精度浮点型数的精度丢失(有效数字位数不够)等。
⑤C语言的数据类型可以构造复杂的数据结构。
例如:使用结构体数组可以构造顺序表,使用指针类型、结构体类型可以构造线性链表(栈、队列)、树和图。
⑥C语言中的数据有变量与常量,它们分别属于上述这些类型。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。