基本数据类型剖析.ppt

上传人:小飞机 文档编号:5952277 上传时间:2023-09-08 格式:PPT 页数:53 大小:318KB
返回 下载 相关 举报
基本数据类型剖析.ppt_第1页
第1页 / 共53页
基本数据类型剖析.ppt_第2页
第2页 / 共53页
基本数据类型剖析.ppt_第3页
第3页 / 共53页
基本数据类型剖析.ppt_第4页
第4页 / 共53页
基本数据类型剖析.ppt_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《基本数据类型剖析.ppt》由会员分享,可在线阅读,更多相关《基本数据类型剖析.ppt(53页珍藏版)》请在三一办公上搜索。

1、第2讲:基本数据类型剖析,变量与常量内储存器的组织数据类型基本数据类型整数类型字符浮点类型,数据(Data)程序需要使用数据。数据是信息的载体。数据有多种形式:数、字符、图片等。常量(Constants)在程序运行之前可以预先设定,并在整个运行过程中没有变化的数据。例如引例中的圆周率3.14。变量(Variables)在程序运行过程中可能变化或被赋值的数据。例如引例中的半径和面积。,数据类型,数据类型的作用决定数据的存储方式和占用的存储空间的大小。决定可以进行的操作。C语言的数据类型基本类型整型(integer),字符型(character),浮点型(floating-point),枚举类型(

2、enumeration)构造类型结构体(structure),共用体(union),数组(array)指针类型(pointer)空类型(void),位、字节和字,内存储器的组织,位(bit):最小的存储单位,可以容纳两个值之一,即0或1。,2000,2001,2002,字节(Byte):基本的存储单位,8位。,字(word):自然的存储单位,包含若干个字节。例如32位机的一个字就是32位。,地址:以字节为单位从0开始编号。,整数的存储方式,有符号的正整数在内存中以二进制补码形式存放。正整数的补码与原码相同。例如:10,符号位,数轴,0,215-1=32767,可表示的数的范围,-215=-32

3、768,整数的存储方式,有符号的负整数在内存中以二进制补码的形式存放。例如:-10,符号位,整数的存储方式,无符号整数所有二进制位都存放数值。例如:65535,0,216-1=65535,可表示的数的范围,整数的类型,C语言提供多种整数类型为程序员提供了针对不同用途的多种选择。,C标准只规定:short int long最大最小值参考,仅供参考,实际值与所使用的操作系统、编译系统、机器有关。,整型常量,整型常量有三种形式:十进制(decimal)整数12 65 65535八进制(octal)整数:带前缀 0(zero)014 0101 0177777十六进制(hexadecimal)整数:带前

4、缀 0 x 或 0X0 xc 0 x41 0 xffff默认类型是int,即有符号的基本整型。可以加上后缀 u 或 U 表示无符号整数,或者 l 或 L 表示长整数。0 xb5Lu,整型变量,声明变量(Declaration)变量在使用之前必须被声明。声明语句的格式:举例,.;,int counter;int width,height;short x,y;long number;,变量声明创建了变量:为变量分配了存储空间。,height,整型变量,初始化(Initialize)变量为变量赋一个初始值。可以在声明语句中初始化变量。举例变量获得值的方法直接赋值输入初始化,int counter=0

5、;int width=352,height=288;,初始化式,288,height,整型变量,输出变量的值可以使用printf()函数。与int类型对应的格式说明符是%d。举例,#include void main()int a,b;a=32767;b=-32768;printf(a=%d,b=%dn,a,b);,a=32767,b=-32768,整数的溢出,溢出整数太大,超出了整数类型的数值范围。使用printf()时与unsigned int类型对应的格式说明符是%u。举例,#include void main()int a,b;unsigned c,d;a=2147483647;b=a

6、+1;c=4294967295;d=c+1;printf(a=%d,b=%dn,a,b);printf(c=%u,d=%u,c,d);,a=2147483647,b=-2147483648c=4294967295,d=0,?,整数的溢出,溢出结果分析结论a+1 的结果(2147483648)超出了基本整型变量 b 所能容纳(表示)的数值范围(-21474836482147483647)。请分析d的结果。,0 1 1 1 1 1 1 1.1 1 1 1 1 1 1,1 0 0 0 0 0 0 0.0 0 0 0 0 0 0,a(2147483647),1 0 0 0 0 0 0 0.0 0 0

7、0 0 0 0,a+1(2147483648),b(-2147483648),12,加正数,减正数,字符的存储方式,字符编码计算机使用一种数字编码(整数)来表示字符,每一个字符都对应一个特定的整数。常用的编码是ASCII(美国信息交换用标准码)。7位二进制数,十进制码值范围从0到127。一般用一个字节保存,最高位为0。字符的存储方式与整数相同举例字母A的ASCII码值为65,那么在内存中以65的二进制形式存储,且占一个字节。,01000001,字符的类型和字符变量,C语言的字符类型:char占一个字节;可视为一个有符号的整数。举例,#include void main()char c1,c2;

8、/声明字符变量 c1=97;/把一个整数赋值给字符变量 c2=c1-32;/字符变量可以进行算术运算 printf(c1=%c,c2=%cn,c1,c2);printf(c1=%d,c2=%dn,c1,c2);,c1=a,c2=Ac1=97,c2=65,字符常量,字符常量用单引号括起来的一个字符。x 9+C语言将字符常量视为int类型。举例(cw02-04.c)如果int类型为16位,char类型为8位,那么对于bc,将把b和c的ASCII码值存储在两个字节中,并把c赋值给变量c2。注意:不同系统处理方式不同,结果不同。,char c1,c2;c1=a;c2=bc;,0 1 1 0 0 0 0

9、 1,c1,0 1 1 0 0 0 1 1,c2,0 1 1 0 0 0 1 1,0 1 1 0 0 0 1 0,bc,L,H,97,99,99,98,字符常量,转义字符(escape character)指代一些特殊的字符。(打印不出来的字符)举例,a 警报 反斜杠()b 退格?问号(?)f 走纸 单引号()n 换行“双引号(”)r 回车ooo 八进制值(o表示一个八进制数字)t 水平制表符xhh 十六进制值(h表示一个十六进制数字)v 垂直制表符,#include void main()printf(atbncbd100 x40n);,abd,浮点数的存储方式,浮点数浮点型数据在内存中按指

10、数形式存放。例如:314.15=3.1415102,由此可见,尾数部分的宽度决定了有效数字的个数(即精度),阶码部分的宽度决定了数值范围。,科学计数法允许使用少量的数字表示很大范围的数和很小的数。,浮点数的类型,浮点数也有多种类型类型名称及典型大小,S=1参考,仅供参考,实际值与所使用的操作系统、编译系统、机器有关。,数轴,0,可表示的正数,可表示的负数,浮点型常量,浮点型常量有两种形式:十进制形式12.3.65 0.指数形式:1.2e-2.1E5 7E01.210-20.11057.0100默认类型是double。可以加上后缀 f 或 F 表示float类型,或者 l 或 L 表示long

11、double类型,否则该常量是double类型。2.3f 1.2L.1E5f,浮点型变量,浮点型变量的声明和初始化举例,float radius;double x=0.0,y=0.0;,不能写成:double x=y=0.0;,浮点型变量,浮点数的输出使用printf()函数float和double对应的格式说明符为%f、%e。举例,#include void main()float f;double d;f=33333.33333f;d=33333.3333333333;printf(f=%fnd=%f,f,d);,f=33333.332031d=33333.333333,有效数字位数是有限

12、的,在可表示的有效位之外的数字被舍去。因此可能会产生误差。,浮点数的舍入误差,浮点数的舍入误差举例,#include void main()float a,b;a=123456.789e5;b=a+20;printf(a=%fnb=%f,a,b);,?,浮点数的舍入误差,浮点数的舍入误差结果分析,a=123456.789e5;b=a+20;,a+20的理论值应该是:但是,一个实型变量能够保证的有效数字是7位,后面的数字将被舍去,是没有意义的。因此,最后得到,应当避免一个很大的数和一个很小的数直接相加或相减,否则就会“丢失”较小的数。,浮点数的溢出,上溢举例若某系统中的最大float值为3.4e

13、38,进行如下操作得到结果下溢举例:假设-10是最小的指数,能够保留四位有效数字如果把数0.1234e-10除以10,将得到结果0.0123e-10,但损失了一位有效数字。,float toobig=3.4e38*100.0f;printf(“toobig=%f,toobig);,inf,无穷大(infinity),小结,C语言有多种数据类型。基本的数据类型包括两大类:整数类型浮点类型开发程序时,应当注意所需变量及其类型的选择。一般使用int和float表示数,用char表示字符。在使用变量的函数的可执行语句之前声明该变量,并为它选择有意义的名字。初始化变量使用的常量应当与变量的类型相匹配。,

14、作用范围和存储类别,简介,变量定义的完整格式:数据类型占据存储空间的大小取值范围存储类别在内存中持续的时间(生存期)在硬件中存放的位置其它属性作用范围可以被引用的程序部分(可见性),作用范围,程序中的所有标识符构成了名字空间。标识符的作用范围能够引用该标识符的程序部分。四种作用范围:文件作用范围函数作用范围程序块作用范围函数原型作用范围,作用范围,文件作用范围在函数外声明的标识符,可以在所有函数中被引用。包括:全局变量,函数定义,函数原型。,int total;int max(int,int);void main()int limit;int max(int x,int y),作用范围从声明的

15、位置开始,到文件的末尾。,作用范围,函数作用范围在函数体内定义的标识符,只能在函数体内被引用。包括:语句标号,void main()loop:goto loop;,作用范围,程序块作用范围在程序块内声明的变量,在程序块内被引用。包括:程序块内的变量(局部变量),函数的参数。,int max(int x,int y)void main()int a;int a;,作用范围从声明的位置开始,到程序块的右大括号,覆盖同名变量,内部变量“覆盖了”外部变量,作用范围,函数原型作用范围函数原型中的参数。,int max(int x,int y);void main()int max(int x,int y

16、),关于声明和定义,定义声明定义一个标识符,同时也是声明。对于变量,定义意味着创建,即为其分配内存。引用声明只是声明一个需要引用的标识符。,存储类别,四种存储类别说明符autoregisterexternstatic两种存储时期自动存储时期autoregister静态存储时期externstatic,自动存储类别,自动存储程序执行到变量所在的程序块内时创建它,退出时销毁。不会被自动初始化。auto(自动变量):局部变量的缺省类别。程序块中声明的变量,函数的参数。register(寄存器变量):建议编译器把变量放进高速的寄存器。只适用于自动变量。,auto int a,b;,register i

17、nt count=1;,静态存储类别,静态存储程序开始执行时创建,在程序执行期间,变量一直存在。自动被初始化,缺省初值:0 或 0。static(静态变量):可以用于在程序块中定义的变量。退出程序块后依然存在,并保留值。但不改变其作用范围,即只能在所在的程序块内被使用。extern(外部变量):用来声明在“外部”定义的全局变量。仅用于声明变量。,static int a,b;,extern int total;,案例分析:存储类别,读下面的程序,写出结果。,void try(int a)auto int b=10;static int c=10;b+;c+;printf(a=%dtb=%dtc

18、=%dn,a,b,c);void main()int i;for(i=1;i=3;i+)try(i);,a=1b=11c=11a=2b=11c=12a=3b=11c=13,案例分析:存储类别,结果分析,c,a,b,a,b,a,b,1,2,3,FF00,2208,2206,2206,2204,2204,2202,a=1b=11c=11a=2b=11c=12a=3b=11c=13,C语言程序的内存映像,C语言程序的内存映像,案例分析:外部变量,#include void main()extern int a;int c=3;printf(a=%dn,a);extern int c;c=4;prin

19、tf(inner c=%dn,c);printf(c=%dn,c);int a=1;int c=5;,a=1inner c=4c=3,案例分析:作用范围与存储类别,#include void a(void);/*function prototype*/void b(void);/*function prototype*/void c(void);/*function prototype*/int x=1;/*global variable*/void main()int x=5;printf(local x in outer scope of main is%dn,x);/*start new

20、 scope*/int x=7;printf(local x in inner scope of main is%dn,x);/*end new scope*/printf(nlocal x in outer scope of main is%dn,x);,案例分析:作用范围与存储类别,a();b();c();a();b();c();printf(local x in main is%dn,x);void a()int x=25;/*initialized each time a is called*/printf(nlocal x in a is%d after enteringn,x);x

21、+;printf(local x in a is%d before exitingn,x);,案例分析:作用范围与存储类别,void b()static int x=50;/*static initialization only*/*first time b is called*/printf(nlocal x in b is%d after enteringn,x);x+;printf(local x in b is%d before exitingn,x);void c()printf(nglobal x is%d on entering cn,x);x*=10;printf(global

22、 x is%d on exiting cn,x);,案例分析:作用范围与存储类别,local x in outer scope of main is 5local x in inner scope of main is 7local x in outer scope of main is 5local x in a is 25 after entering alocal x in a is 26 before exiting alocal x in b is 50 after entering blocal x in b is 51 before exiting bglobal x is 1

23、on entering cglobal x is 10 on exiting c,案例分析:作用范围与存储类别,local x in a is 25 after entering alocal x in a is 26 before exiting alocal x in b is 51 after entering blocal x in b is 52 before exiting bglobal x is 10 on entering cglobal x is 100 on exiting clocal x in main is 5,包含多个源文件的程序,每个函数的定义必须在一个文件内,

24、不能被分割。全局变量可以被同一文件内的函数访问。如果需要被其他文件内的函数访问,则必须在其他文件内声明。extern 表示变量myGlobal是在另一个文件内定义的。一个文件内定义的函数,也可以被其他文件内的函数调用。在每个文件内加入该函数的原型(声明为外部函数)。函数的原型可以不需要 extern。,int myGlobal;,extern int myGlobal;,a.c,b.c,包含多个源文件的程序,举例,int a,b;extern int max(void);void main()scanf(%d%d,extern int a,b;int max()return(ab?a:b);,

25、A,B,cw0904a.c,cw0904b.c,包含多个源文件的程序,static限制全局变量只能被同一文件内的函数访问。限制函数只能被同一文件内的函数调用。,static int myGlobal;static void myFunc(),编译包含多个源文件的程序,编译包含多个源文件的程序每个源文件必须被编译,然后链接成一个可执行文件。如果有一个文件作了改动,则必须重新编译所有相关的文件。一般会提供 make 工具用来管理和编译多源文件的程序。创建 makefile 文件,记录编译规则。自动查找必须编译的源文件。可以创建工程(project)文件来管理多源文件的程序。,小结,用于存储程序数据的内存可用存储时期和作用范围来表征。存储时期可以是静态的或自动的。如果是静态的,变量所用内存在程序开始执行时被分配,并在程序执行时一直存在。如果是自动的,变量所用内存在程序执行到该变量定义所在的代码块时开始分配,在退出代码块时释放。作用范围决定了哪一部分程序可以访问某个数据。C语言程序可以包含多个源文件,在编译时,逐一编译各文件,然后通过链接器链接所有的目标代码构成可执行文件。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号