第3章数据类型、运算符与表达式3.1C的数据类型算法处理的对象是数据,考虑算法时要注意数据结构。数据是以种特定的形式存在的:整、实、字符等。算法与编程是相辅相成的,考虑的问题有:1.数据的描述:称数据结构,加工处理的数据类型。2.动作的描述:告诉计算机要的操作步骤。数据结构:反映不同数据的构造形式。不同语言所提供的数据结构是不同的,因而算法也有差异。例如:对十个整数进行排序和对十个整数构成的数组排序算法是不同的。在考虑算法时,必须考虑数据结构,以便选择最佳设计方案。C语言提供的数据结构是以数据类型的形式出现的用指针、结构体还可构成链表、树、栈等复杂的数据结构整型字符型实型(浮点型)枚举类型单精度型双精度型数组类型结构体类型共用体类型基本类型构造类型指针类型空类型(void)数据类型3.2常量与变量3.2.1常量和符号常量常量:在程序执行过程中,数值始终保持不变的量。整型:5,-26,0实型:3.14,-2.45,2.17178字符:‘a’,‘1’,‘A’,‘$’标识符(符号)#definepi3.14常量一般从其字面形式即可判别常量例T3-1.c#definePRICE30main(){intnum,total;num=10;total=num*PRICE;printf(“total=%d”,total);}输出:total=300符号常量:见名知意,程序中一改全改.3.2.2变量变量:在程序执行过程中,其值可以变化的量。说明:1.变量名:由合法标识符(函数、数组、文件、结构体等名称都称标识符)组成。2.标识符构成:字母、数字、下划线。第一个字符必须是字母或下划线,如:ab,_12,a3c5均为合法标识符,而5ba$e,wang-1为非法。3.标识符长度:一般1~8个合法字符(Tc中,长度达248个字符,有效字符前32个)。4.标识符中:大小写字母是有区别,如,A,a是两个不同的标识符。5.变量的使用:按先定义后使用的原则进行。6.变量类型能进行有关运算的合法性检查,如a%b,两边必须是整型数据。7.不同类型的变量,在内存中占据不同的存储单元,变量所对应的单元中存放变量的值,要区分变量名和变量值两个不同的概念。3.3整型数据3.3.1整型常量1、十进制整数:如29,-36,02、八进制整数:以0开头,后跟0~7中的若干数字;如:0123(83)103、十六进整制:以0x开头,后跟0~9,A,B,C,D,E,F(可小写)中的若干字符,如0xA2(162)103.3.2整型变量1、整型变量在内存中的存放形式数据在内存中是以二进制补码形式存放的。例:inti,j;i=10;j=-10;正数的补码:与原码相同。求负数补码:①求该数的绝对值的二进制;②对其值求反加1i10数据i存放示意图数据i在内存中实际存放情况0000000000001010-10j数据j存放示意图数据j在内存中实际存放情况11111111111101102、整型变量的分类根据数值的范围可定义以下类型的变量:1、基本型:用int定义2、短整型:用shortint或short定义3、长整型:用longint或long定义整型:unsignedint4、无符号型:短整:unsignedshort长整:unsignedlong无符号数据的特点:最高位不是作为符号位,而是作为存放有效数值本身,它不能存放负数。例:inta;/*a的数值范围为-32768~32767*/unsignedintb;/*b的数值范围为0~65535*/符号位有符号整型变量a=327670111111111111111无符号整型变量b=655351111111111111111数值有效位类型比特数取值范围int16-32768~32767short16-32768~32767long32-2147483648~2147483647unsignedint160~65535unsignedshort160~65535unsignedlong320~4294967297ANSI标准定义的整数类型3、整型变量的定义:对变量强制类型定义的目的:让编译为其分配内存单元。各种变量的定义一般在函数的开始部分,也可以在分程序{}中定义,若在分程序中定义,其作用域仅在分程序中有效。例T3-2.cmain(){inta,b,c,d;unsignedintu;a=12;b=-24;u=10;c=a+u;d=b+u;{inta;a=8*9;printf(“a=%d\n”,a);}/*加上此复合语句结果?*/printf(“a+u=%d,b+u=%d\n”,c,d);}运算结果:a+u=22,b+u=-14由此可见:不同类型的整型数据可以进行混合运算4、整型数据的溢出int型变量最大允许值为32767,如果大于此数,将产生溢出例3.3整型数据的溢出情况main(){inta,b;a=32767;b=a+1;printf(“%d,%d”,a,b);}运行结果:32767,-327680111111111111111a:→327671000000000000000b:→-32768从上图可知,变量a的最高位为0,低15位为1,表示32767而变量b最高位为1,低15位为0,表示-32768。此种情况,编译系统不会报错,这要靠编程者的细心和经验。3.3.3、整型常量的类型整型常量本身隐含了某种数据类型,将整型常量赋给整型变量时,要考虑常量的大小和变量所能表示的数据范围。一个整数,其值在如下范围:(1)-32768~32767int,shortint,longint(2)-2147483648~2147483647longint(3)对于非负数,如:0~65535unsignedint,unsignedshort0~4294967295unsignedlong说明:1.常量中无unsigned类型的数,正整数可赋给unsigned变量,只要数值不超过范围。2.在整型常量后加l或L表示长整型常量,如:456L。3.在函数调用时,若被调用函数的形参是长整型变量,则要求主调函数的实参也是长整型数据。3.4实型数据3.4.1实型常量的表示方法实数又称浮点数1.十进制形式:由数字和小数点组成,如:3.14,0.26,0.0,326.452.指数形式:由尾数部分、字母e或E、指数部分组成。如:48.62e+12,其中:48.62为尾数,+12为指数,e为基数10,它表示48.621012C规定:e的前面要有数字,e的后面要有整数。3.4.2实型变量1、实型数据在内存中的存放形式float型变量:32位double型变量:64位数符阶符d29(7位阶码)d23d22(23位规格化数补码)d02127-1≈1038数符阶符d61(10位阶码)d52d51(52位规格化数补码)d021024-1≈103082、实型变量的分类float型表示数的范围:最大正数:(1-2-23)2127=1038最小负数:-12127=-1038接近0的正数:2-12-128=3.910-38接近0的负数:-(2-1+2-23)2-128=-3.910-38double型表示数的范围:最大正数:(1-2-52)21023=10308最小负数:-121023=-10308接近0的正数:2-12-1024=10-308接近0的负数:-(2-1+2-52)2-1024=-10-308longdouble型表示数的范围:最大正数:-10-4931~104931实型常量可赋给float或double型变量,根据变量类型截取实型常量的有效位。单精度实型数据(float)表数范围:十进制形式:7位有效位指数形式:.e双精度实型数据(double)表数范围:十进制形式:16位有效位指数形式:.e双精度实型数据(longdouble)表示数据范围:十进制形式:16位有效位指数形式:.ex3、实型数据的舍入误差实型数据是由有限的存储单元来存储的,因此提供的有效数字总是有限的,在有效位以外的数字将被舍去,由此可能会有一些误差。例T3-4.cmain(){floata,b;longdoublec;a=123456.678e5;b=a+20;c=123456789.123456789e4923;printf(“a=%f\nb=%f\nc=%Lf\n”,a,b,c);}输出结果:a=12345678848.000000b=12345678848.000000c=1.234567891234567890000000000000000000000e+4931a的值比20大的多,a+20的理论值是12345678920,而实型变量有效位只有7位,因此,后面的数字是无意义的,应避免将一个很大的数和一个很小的数相加或相减,以免造成误差。3.4.3实型常量的类型1、未加说明,系统将实型常量作为双精度处理例:floatf;f=2.45678*4532.65系统将两数按双精度运算,然后将前7位赋给实型变量f,缺点:浪费系统资源,降低运算速度;解决的办法:在数的后面加f,如2.45678f,系统将其按单精度数运算。2、实型常量赋给float或double类型变量时,根据变量的类型截取实型常量的有效位。例T3-4-1.cmain(){floatf1;doublef2;f1=111111.111;f2=111111.11111;printf(“f1=%f\nf2=%lf\n”,f1,f2);}输出结果:f1=111111.109375f2=111111.1111103.5字符型数据3.5.1字符常量字符常量:用一对单引号括起的一个字符,如‘a’,‘A’,‘#’,‘9’说明:1.字符常量的值是该字符在ASCII码中的码值。2.‘a’和‘A’是两个不同的字符常量,‘a’97,‘A’653.‘\’开头的字符序列称为特殊形式的字符常量(转义字符)常用的转义字符功能及码值转义字符功能十进制的ASCII码值\a响铃7\b退格8\f换页12\n换行10\r回车13\t横向跳八格9\ddd三位八进制\101‘A’\xhh两位十六进制\x42‘B’例T3-5.cmain(){printf(“---------------\n”);printf(“-ab-c\t-de\rf\tg\n”);printf(“h\ti\b\bj-k\n”);}运行后屏幕显示结果:----------------fgdehj-k注意:打印机和屏幕显示结果不同。不会象屏幕那样会“抹掉”原字符,能够真正反映输出的过程和结果。运行后打印机显示结果:----------------fabgdehjik3.5.2字符变量字符变量:用于存放一个字符常量。字符变量的定义形式:如:charc1,c2;/*定义c1,c2为字符型变量,占一个字节*/c1=‘a’;c2=‘b’;/*将字符常量‘a’,‘b’赋给c1和c2*/2.5.3字符数据在内存中的存储形式及使用方法字符常量存放到字符变量中,是把其ASCII码值存放到内存中,由于其存储形式与整数存储形式相似,所以整、字符型数据之间可通用。例T3-6.cmain(){charc1,c2;c1=97;c2=98;printf(“c1=%c,c2=%c\n”,c1,c2);printf(“c1=%d,c2=%d\n”,c1,c2);}运行结果:c1=a,c2=bc1=97,c2=98c1c29798←内存中变量c1、c2的值c1c2←内存中变量c1、c2实际存储形式0110000101100010例T3-7.c大小写字母的转换main(){charc1,c2;c1=‘a’;c2=‘b’;c1=c1-32;c2=c2-32;printf(c1=%c,c2=%c\n”,c1,c2);}运行结果:c1=A,c2=B01100001a存储(ASCII码)“%c”“%d”a97输出格式符显示例T3-7-1.c字符数据与整型数据之