1、1/6/20231上一节我们学到了n各种类型常量、转义字符、各种类型常量、转义字符、ASCII码码n5.0 5.0f a n保存不变量的两种方法:保存不变量的两种方法:#define constn变量先声明后使用变量先声明后使用n标识符的命名规则标识符的命名规则nvariableNamenCONST_VARIABLE_NAME1/6/20232内容n3.1 顺序程序设计举例顺序程序设计举例n3.3 C语句语句n3.4 数据数据的的输入输出输入输出1/6/20233内容n3.1 顺序程序设计举例顺序程序设计举例n3.2 数据的表现形式及其运算n3.2.1 常量和变量n3.2.3 整型数据整型数据
2、n3.2.4 字符型数据字符型数据n3.2.5 浮点型数据浮点型数据n3.2.6 怎样确定常量的类型怎样确定常量的类型n3.2.7 运算符和表达式运算符和表达式n3.3 C语句语句n3.4 数据数据的的输入输出输入输出1/6/202343.2.2 数据类型n不同的类型分配不同的不同的类型分配不同的长度和存储形式长度和存储形式。1/6/20235基本数据类型(Data Type)nintn整数,在目前绝大多数机器上占整数,在目前绝大多数机器上占4个字节个字节nTC2中是中是2个字节个字节n所占字节数所占字节数取决于机器字长取决于机器字长nfloatn单精度浮点数,一般是单精度浮点数,一般是4个字
3、节长个字节长ndoublen双精度浮点数,一般是双精度浮点数,一般是8个字节长个字节长ncharn字符,一般是字符,一般是1个字节长个字节长n用来表示用来表示256个个ASCII字符,或者字符,或者0255的整数的整数1/6/20236sizeof.c#include#include int main(void)printf(类型类型tt大小(大小(bytes)n);printf(shorttt%dn,sizeof(short);printf(inttt%dn,sizeof(int);printf(longtt%dn,sizeof(long);printf(floattt%dn,sizeof(
4、float);printf(doublett%dn,sizeof(double);printf(long doublet%dn,sizeof(long double);printf(chartt%dn,sizeof(char);return 0;1/6/20237数据类型修饰符nshortnshort int,短整数,一般,短整数,一般2个字节长。通常简写为个字节长。通常简写为shortnlongnlong int,长整数,一般是,长整数,一般是4个字节长。通常简写为个字节长。通常简写为longnlong double,高精度浮点数,高精度浮点数,VC6占占8个字节。个字节。nsignedn用
5、来修饰用来修饰char、int、short和和long,说明他们是,说明他们是有符号有符号的整数(正整数、的整数(正整数、0和负整数)。一般和负整数)。一般缺省缺省都是有符号的,都是有符号的,所以这个修饰符通常省略所以这个修饰符通常省略nunsignedn用来修饰用来修饰char、int、short和和long,说明他们是,说明他们是无符号无符号的整数(正整数和的整数(正整数和0)1/6/202383.2.3 整型数据n以以补码补码形式存储形式存储n正整数:本身正整数:本身n负整数:对应正整数负整数:对应正整数 按位取反按位取反+1nQ:下面的语句输出?:下面的语句输出?nunsigned s
6、hort price=-1;nprintf(%dn,price);nA:65535nwhy?n-1的补码:的补码:11111111 11111111n最左一位不是符号最左一位不是符号1/6/20239整型类型的取值范围-取决于字节数limits.h1/6/20231015位 215-1=327672个字节有符号整数的最小最大值n最大值最大值n01111111 11111111=215-1=32767 n最小值最小值n10000000 00000000=-327681/6/202311超出取值范围会怎样?nVC6中中int的范围是的范围是-21474836482147483647n-231231
7、-1n如果我们给它一个小于如果我们给它一个小于-2147483648或者大于或者大于2147483647的数会如何呢?的数会如何呢?1/6/202312整数溢出/*toobig.c-exceeds maximum int size on our system*/#include int main(void)int i=2147483647;/int最大值最大值 unsigned int j=4294967295;/unsigned int最大值最大值 printf(%d%d%dn,i,i+1,i+2);printf(%u%u%un,j,j+1,j+2);return 0;输出:输出:21474
8、83647 -2147483648 -2147483647 4294967295 0 1%u:以无符号整数形式输出以无符号整数形式输出1/6/202313溢出(Overflow)造成的危害n一台安装了一台安装了Windows 95/98的机器,如果连续运行的机器,如果连续运行49.7天没有重新启动,可能死机天没有重新启动,可能死机 n原因:原因:nWindows自启动时刻起,有一个计数器,记录自启动时刻起,有一个计数器,记录系统已经运行了多少系统已经运行了多少毫秒毫秒。这个计数器是个。这个计数器是个unsigned long 类型的变量类型的变量nunsigned long的最大值是:的最大值
9、是:4294967295n一天有一天有 24*60*60*1000=86400000毫秒毫秒n4294967295/86400000=49.71026961805n当当49.7天的时候,此计数器会溢出,引起死机天的时候,此计数器会溢出,引起死机1/6/2023143.2.4 字符型数据nQ:输出结果?:输出结果?nchar c=?;nprintf(%d%cn,c,c);nA:63?nQ:输出结果?输出结果?nchar c=255;nprintf(%dn,c);nA:-1nwhyn默认默认signedn如改为如改为 unsigned char c=255;输出输出2551/6/2023153.2
10、.5 浮点型数据ndouble范围大、精度高、速度稍快范围大、精度高、速度稍快VC6TC21/6/202316浮点类型的取值范围float.h1/6/202317浮点数的存储1/6/202318IEEE标准标准1/6/202319浮点数的陷阱#include int main()float f;f=123.456f;if(f=123.456)printf(f is equal to 123.456 indeed.);else printf(In fact,f is equal to%fn,f);return 0;Q:运行结果会是什么?:运行结果会是什么?1/6/202320浮点数的陷阱n浮点数
11、往往只是实际值的近似浮点数往往只是实际值的近似nfloat的精度低,较易发生精度带来的相等性判的精度低,较易发生精度带来的相等性判断问题断问题ndouble精度高,这个问题发生的概率小一些,精度高,这个问题发生的概率小一些,但也存在但也存在n解决办法解决办法:if(fabs(f 123.456)(float long int short char)n只要两者中有一个是只要两者中有一个是unsigned,就都转为,就都转为unsigned再计算再计算n把数据赋值给另外一种类型变量也会发生自动类把数据赋值给另外一种类型变量也会发生自动类型转换型转换n从小到大,顺利转换从小到大,顺利转换n从大到小,
12、发出警告(好的编译器会给出)从大到小,发出警告(好的编译器会给出)1/6/202328自动类型转换举例nint i=3;nfloat f=2.5f;ndouble d=7.5;n分析分析10+a+i*f-d/3n编译编译时,时,从左至右从左至右扫描。扫描。n1.先计算先计算10+a(97),结果为,结果为107n2.先计算优先级高的先计算优先级高的i*f,将,将i和和f转换为转换为double型,结果为型,结果为7.5,double型型n3.n12+A /12+65(A的的ASCII码码)1/6/202329例3.3 给定一个大写字母,要求用小写字母输出。/3_3.c-给定一个大写字母,要求用
13、小写字母输出给定一个大写字母,要求用小写字母输出#include int main()char cUpper,cLower;cUpper=A;cLower=cUpper+32;printf(%cn,cLower);printf(%dn,cLower);return 0;1/6/202330类型强转n可以通过可以通过“(类型类型)表达式表达式”的方式把表达式的值的方式把表达式的值转为任意类型转为任意类型n(double)a (将转换成(将转换成double类型)类型)n(int)(x+y)(将(将x+y的值转换成的值转换成int型)型)n(float)(5%3)(将(将5%3的值转换成的值转换成
14、float型)型)n注意注意n强转时,你必须知道你在做什么强转时,你必须知道你在做什么n强转与指针,并称强转与指针,并称C语言两大神器,用好了可语言两大神器,用好了可以呼风唤雨,用坏了就损兵折将以呼风唤雨,用坏了就损兵折将1/6/202331这一节我们学到了n数据类型数据类型nchar,short,int,long,float,double,long doublensigned,unsignedn算术运算、自增算术运算、自增/自减运算自减运算n类型转换类型转换1/6/202332找别扭nint a=1;if(a=0)printf(OK);nint a=0;if(a=0)printf(OK);nint a=1;if(a=0)printf(OK);nint a=0;if(a=0)printf(OK);1/6/202333=和=nint a;a=0;a=1;nint a;a=0;a=1;n一定要分清一定要分清=和和=n下面用法能起点小作用:下面用法能起点小作用:nint a=0;if(0=a)printf(OK);nint a=0;if(0=a)printf(OK);1/6/202334作业nP55 用户从键盘输入一个小写字母,要求用对应用户从键盘输入一个小写字母,要求用对应的大写字母输出。的大写字母输出。nP83 习题习题31/6/202335本周日上午8:30 实验2