1第2章数据类型与表达式2第2章数据类型与表达式►2.1数据类型►2.2常量►2.3变量►2.4运算符与表达式►2.5类型转换32.1数据类型利用计算机求解问题,首先需要将实际问题的数据引入到计算机中,即在程序中描述这些数据。由于计算机存储和处理上的特点,数据是以某种特定的形式存在的(如整数、浮点数、字符信息等),不同的数据之间还存在某些联系。程序语言通过数据类型描述不同的数据形式,数据类型不同,求解问题的算法也会不同。类型是所有程序的基础,它告诉我们数据代表什么意思以及对数据可以执行哪些操作。42.1数据类型C语言内置数据类型52.1数据类型表2-1基本类型数据的内存长度和数值范围类型类型标识符内存长度数值范围精度整型[signed]int4-2147483648~+2147483647无符号整型unsigned[int]40~4294967295短整型[signed]short[int]2-32768~+32767无符号短整型unsignedshort[int]20~65535长整型[signed]long[int]4-2147483648~+2147483647无符号长整型unsignedlong[int]40~4294967295字符型[signed]char1-128~+127无符号字符型unsignedchar10~255单精度型float47双精度型double816长双精度型longdouble同上/12同上/1938383.4103.4103083081.7101.710493249321.2101.21062.1.1整型►C语言整型分为长整型(longint)、基本整型(int)和短整型(shortint)►longint可以简写为long、shortint可以简写为short。►int型数据的内存长度与系统平台相关,通常int型为机器的一个字长,short型不比int型长,long型不比int短。72.1.1整型整型数据的存储方式为二进制补码形式,例如短整型数123在内存中的存储形式为短整型数-123在内存中的存储形式为82.1.1整型图2.1有符号和无符号短整型的数值范围整型还分有符号(signed)和无符号(unsigned)类型,其中signed书写时可以省略。一般地,由于计算机处理整型速度快,因此若运算不涉及小数,就尽量选用整型。而那些没有负值的整数,如学号、逻辑值、字节值、地址、索引值等选用unsigned类型。92.1.1整型图2.2short型的溢出►不同的数据类型规定了不同的机器数长度,决定了对应数据的数值范围,当一个整数超出此范围时计算机会将其转换为在数值范围内所允许的一个数,称为整型数据的溢出处理。►一般地,超过最大值的有符号整型数值会向上溢出变成负数,超过最小值的数据会向下溢出变成正数。102.1.2浮点型►C语言浮点型又称实型,分为单精度(float)、双精度(double)和长双精度(longdouble)3种。►在VC中规定float型在内存中占用4个字节,提供7位有效数字;double型和longdouble型在内存中占用8个字节,提供16位有效数字。在GCC中longdouble型在内存中占用12个字节,提供19位有效数字。►浮点型数据在内存中的存储方式按IEEE754浮点数标准处理,不同于整型数据那样直接的二进制表示。112.1.2浮点型►因为浮点型数据长度和精度是有限的,所以浮点数存在舍入误差和计算误差。虽然浮点数精度越高计算结果越精确,但其处理时间也长。一个较大的浮点数与一个很小的浮点数做加法时,由于精度限制使得很小的浮点数被忽略了,从而使得这样的加法无意义。两个浮点数做比较,由于有误差很难做到绝对相等,只能通过它们差的绝对值小于一个很小的数来判断是否近似相等。122.1.2浮点型例2.11#includestdio.h2intmain()3{4floata=0.00000678f,b=0.00000123f;5doublec=0.00000678,d=0.00000123;6doublee=100000000000000000000.0;7a=a+111111.111f;//精度范围外的大浮点数与小浮点数相加8b=b+111111.111f;//精度范围外的大浮点数与小浮点数相加9c=c+111111.111;//精度范围内的大浮点数与小浮点数相加10d=d+111111.111;//精度范围内的大浮点数与小浮点数相加11e=e+111111.111f;//精度范围外的大浮点数与小浮点数相加12printf(a=%.16f,b=%.16f\n,a,b);//输出单精度浮点型a,b13printf(c=%.16lf,d=%.16lf\n,c,d);//输出双精度浮点型c,d14printf(e=%lf\n,e);//输出双精度浮点型e13程序运行屏幕2.1.2浮点型例2.115return0;16}a=111111.1093750000000000,b=111111.1093750000000000c=111111.1110067800000000,d=111111.1110012300100000e=100000000000000110000.000000142.1.3字符型►C语言字符型分为有符号(signedchar)和无符号(unsignedchar)两种,其中signed书写时可以省略。►字符型数据在内存中占用1个字节,采用二进制形式存储。152.1.3字符型►字符型数据可以存储整型数值,有时也称为字节型。字符型数据存储整数时的内存形式与整型一样,只不过其数值范围要小得多。►字符型数据可以存储单字节字符,如ASCII码,此时在内存中的数据是字符的ASCII码值。例如字符'A'在内存中的存储形式为162.1.3字符型►在C语言中字符型数据和整型数据之间可以通用。一个字符数据可以赋给整型变量,一个整型数据也可以赋给字符型变量,还可以对字符型数据进行算术运算。►一般地,单字节字符和小范围的整型,如月份、日期、逻辑值、性别等使用字符型。C语言没有多字节字符(如汉字)数据类型,描述这些数据需要使用字符数组来构造。172.1.3字符型例2.21#includestdio.h2intmain()3{4inti,j;5charc1,c2;6c1='a';//字符数据赋值给字符型7c2=98;//整数数据赋值给字符型8i='A';//字符数据赋值给整型9j=66;//整数数据赋值给整型10printf(i=%d,j=%d,c1=%c,c2=%c\n,i,j,c1,c2);11printf(c1-32=%c\n,c1-32);//字符型可以进行减法运算12return0;13}182.1.3字符型例2.2程序运行结果程序运行屏幕i=65,j=66,c1=a,c2=bc1-32=A192.2常量►常量(constant)是指程序中其值不能被修改的数据,分为字面常量和符号常量。►从字面形式即可识别的常量称为字面常量(literalconstant),例如64、3.1415926和‘A’等。►每个字面常量都具有数据类型,由它的书写形式和值来决定。202.2.1整型常量►一个整型常量可以用3种不同的方式表示:►(1)十进制整数。•以非零十进制数1~9组成的整数,例如13579,-24680等。►(2)八进制整数。•以0开头和八进制数0~7组成的整数,例如0,012,0177等。►(3)十六进制整数。•以0x或0X开头和十六进制数0~9、A~F或a~f组成的整数(字母大小写任意),例如0x1234,0xab,0xCF等。212.2.1整型常量►整型常量从字面上区分数据类型的方法是:►(1)整型常量默认的类型为int型。根据系统平台,若int和long型数据占用内存大小相同,则一个int型常量也是long型常量。若int和short型数据占用内存大小相同,则一个int型常量也是short型常量。►(2)一个整数如果其值在范围内,则它是short型。►(3)一个整数如果其值超出上述范围,但在范围内,则它是long型。222.2.1整型常量►整型常量从字面上区分数据类型的方法是:►(4)在一个整数值后面加一个字母l或L,则它是long型。例如123是int型,123L是long型。后缀符号一般用L而不用小写的l,避免与数字1混淆。►(5)整数默认是signed型,在一个整数后面加一个字母u或U,则它是unsigned型。232.2.1整型常量18//十进制表示022//八进制表示0x12//十六进制表示0//signedint168//signedint168U//unsignedint2147483647//signedlong-1L//signedlong65535Lu//unsignedlong242.2.2浮点型常量►一个浮点型常量可以用两种不同的方式表示:►(1)小数形式。由小数点、十进制整数和小数组成的浮点数,如、等。整数和小数可以省略其中之一,但不能省略小数点,如.123、123.、0.0等。►(2)指数形式,又称科学记数法表示。以fEn或fen格式组成的浮点数,其中E或e表示以10为低的幂,n为指数且必须是整型,f可以是整数或小数。►浮点型常量默认为double型。若在浮点数后面加一个字母f或F,则它是float型。若在浮点数后面加一个字母l或L,则它是longdouble型。252.2.3字符常量►1.用字面常量表示字符常量►以一对单引号(‘’)括起来的一个字符表示字符常量,如‘A’、‘0’、‘&’等。►字符常量表示的是一个字符,存储的是该字符的ASCII码值。例如‘A’表示英文字符A,数据值是65;‘2’表示数字字符2,数据值是50。►单引号是字符常量的边界符,它只能包括一个字符,如'AB'的写法就是错误的。262.2.3字符常量►1.用字面常量表示字符常量►字符'2'和整数2的写法是有区别的,前者是字符常量,后者是整型常量,它们的含义和在内存中的存储形式完全是不相同的。272.2.3字符常量►2.用转义字符表示字符常量►以反斜线(\)开头,后跟一个或几个字符序列表示的字符称为转义字符,如\n表示换行符。►转义字符中的字符序列已转换成另外的含义,故称之为“转义”。如\n中的n不代表字母n而是换行符。►采用转义字符可以表示ASCII字符集中不可打印或不方便输入的控制字符和其他特定功能的字符。282.2.3字符常量表2-2转义字符及其含义转义字符形式含义ASCII码值\a响铃符7\b退格符8\f进纸符,将光标位置移到下页开头12\n换行符,将光标位置移到下一行开头10\r回车符,将光标位置移到本行开头13\t水平制表符,光标跳到下一个TAB位置9\v垂直制表符11\'单引号39\双引号34\\反斜线92\?问号63\0空字符0\ooo用1~3位八进制数ooo为码值所对应的字符ooo(八进制)\xhh用1~2位十六进制数hh为码值所对应的字符hh(十六进制)292.2.3字符常量\ooo和\xhh称为通用转义字符,其中ooo表示可以用1至3位八进制数作为码值表示一个ASCII字符,hh表示可以用1至2位十六进制数作为码值表示ASCII字符。C语言规定通用转义字符在3位或不足3位的第一个非八进制数处结束,或在2位或不足2位的第一个非十六进制数处结束。例如\1234被识别为“\123和4”,\128被识别为“\12和8”,\19被识别为“\1和9”,而\9是错误的。初学者需要注意不要将\xhh写成\0xhh。由于字符型数据在内存中只占用1个字节,即使按无符号处理其最大值也仅是255(八进制为377),因此ooo的数值范围为0~377(八进制),其他值使得字符型数据溢出。同理,hh的数值范围为0~FF。302.2.3字符常量例2.31#includestdio.h2intmain()3{4printf(abc\tde\rf\tg\n);5