C语言的基本数据类型及其表示

上传人:jin****ng 文档编号:164564616 上传时间:2022-10-25 格式:DOCX 页数:14 大小:50.67KB
收藏 版权申诉 举报 下载
C语言的基本数据类型及其表示_第1页
第1页 / 共14页
C语言的基本数据类型及其表示_第2页
第2页 / 共14页
C语言的基本数据类型及其表示_第3页
第3页 / 共14页
资源描述:

《C语言的基本数据类型及其表示》由会员分享,可在线阅读,更多相关《C语言的基本数据类型及其表示(14页珍藏版)》请在装配图网上搜索。

1、3.2 C语言的基本数据类型及其表示C语言的基本数据类型包括整型数据、实型数据和字符型数据,这些不同数 据类型如何表示?如何使用?它们的数据范围是什么?下面我们分别进行介绍。3.2.1常量与变量1.常量常量是指程序在运行时其值不能改变的量,它是C语言中使用的基本数据对象之一。C语言提供的常量有:厂馥值常重 常壘彳aJ宇符常重*厂整型常壘r:宇符常量屮:宇符串常壘以上是常量所具有的类型属性,这些类型决定了各种常量所占存储空间的大 小和数的表示范围。在c程序中,常量是直接以自身的存在形式体现其值和类 型,例如:123是一个整型常量,占两个存储字节,数的表示范围是-3276832767; 123.0

2、是实型常量,占四个存储字节,数的表示范围是-3.4 10-383.4 1038。需要注意的是,常量并不占内存,在程序运行时它作为操作对象直接出现在 运算器的各种寄存器中。2符号常量在C程序中,常量除了以自身的存在形式直接表示之外,还可以用标识符 来表示常量。因为经常碰到这样的问题:常量本身是一个较长的字符序列,且 在程序中重复出现,例如:取常数的值为3.1415927,如果在程序中多处出现, 直接使用3.1415927的表示形式,势必会使编程工作显得繁琐,而且,当需要把 的值修改为3.1415926536时,就必须逐个查找并修改,这样,会降低程序的可 修改性和灵活性。因此,C语言中提供了一种符

3、号常量,即用指定的标识符来表 示某个常量,在程序中需要使用该常量时就可直接引用标识符。C语言中用宏定义命令对符号常量进行定义,其定义形式如下:#define标识符 常量其中#define是宏定义命令的专用定义符,标识符是对常量的命名,常量可 以是前面介绍的几种类型常量中的任何一种。该使指定的标识符来代表指定的常 量,这个被指定的标识符就称为符号常量。例如,在C程序中,要用PAI代表 实型常量3.1415927,用W代表字符串常量Windows 98,可用下面 两个宏 定义命令:#define PAI 3.1415927#define W Windows 98宏定义的功能是:在编译预处理时,将程

4、序中宏定义(关于编译预处理和宏 定义的概念详见9.10节)命令之后出现的所有符号常量用宏定义命令中对应的 常量一一替代。例如,对于以上两个宏定义命令,编译程序时,编译系统首先将 程序中除这两个宏定义命令之外的所有PAI替换为3.1415927,所有W替换为 Windows 98。因此,符号常量通常也被称为宏替换名。习惯上人们把符号常量名用大写字母表示,而把变量名用小写字母表示。例 3-1是符号常量的一个简单的应用。其中,PI为定义的符号常量,程序编译时, 用3.1416替换所有的PI。例3-1:已知圆半径r,求圆周长c和圆面积s的值。#define PI 3.1416main() float

5、r,c,s;scanf(%d, &r);c=2*PI*r; /* 编译时用 3.1416 替换 PI */s=PI*r*r; /* 编译时用 3.1416 替换 PI */printf(c=%6.2f,s=%6.2fn,c,s);3变量变量是程序设计语言中一个重要概念,它是指在程序运行时其值可以改变的 量。这里所说的变量与数学中的变量是完全不同的概念。在C语言以及其他各 种常规程序设计语言中,变量是表述数据存储的基本概念。我们知道,在计算机 硬件的层次上,程序运行时数据的存储是靠内存储器、存储单元、存储地址等一 系列相关机制实现,这些机制在程序语言中的反映就是变量的概念。程序里的一个变量可以看

6、成是一个存储数据的容器,它的功能就是可以存储 数据。对变量的基本操作有两个:向变量中存入数据值,这个操作被称作给 变量赋值。取得变量当前值,以便在程序运行过程中使用,这个操作称为 取值。变量具有保持值的性质,也就是说:如果在某个时刻给某变量赋了一个 值,此后使用这个变量时,每次得到的将总是这个值。因为要对变量进行赋值和取值操作,所以程序里的每个变量都要有一个 变量名,程序是通过变量名来使用变量的。在C语言中,变量名是作为变量的 标识,其命名规则符合标识符的所有规定。以下是合法的变量名:f1 total name_1 _sum ave1 r123stu_12_1 stu_name x1 x1_

7、pi yearC语言提供的基本变量类型有:字符变量指针变量C语言要求:程序里使用的每个变量都必须首先定义,也就是说,首先需要 声明一个变量的存在,然后才能够使用它。要定义一个变量需要提供两方面的信 息:变量的名字和它的类型,其目的是由变量的类型决定变量的存贮结构,以便 使C语言的编译程序为所定义的变量分配存储空间。4变量的定义变量是以标识符的形式来表示其类型。在C语言中,是用类型说明语句对 变量进行定义,其定义形式如下:类型说明符变量名表;其中,类型说明符是C语言中的一个有效的数据类型,如整型类型说明符 int,字符型类型说明符char等。变量表的形式是:变量名1,变量名2, 变量名n即:用逗

8、号分隔的变量名的集合。最后用一个分号结束定义。定义变 量的这种语言结构称为变量说明,例如下面是某程序中的变量说明:int a, b, c; /* 说明 a,b,c 为整型变量 */char cc; /* 说明 cc 为字符变量 */double x, y; /* 说明 x,y 为双精度实型变量 */可见,一个定义中可以说明多个变量。而且,由于C语言是自由格式语言, 把多个变量说明写在同一行也是允许的。但是为了程序清晰,人们一般不采用这 种写法,尤其是初学者。在 C 程序中,除了不能用关键字做变量名外,可以用 任何标识符做变量名。但是,一般提倡用能说明变量用途的有意义的名字为变量 命名,因为这样

9、的名字对读程序的人有一定提示作用,有助于提高程序的可读性, 尤其是当程序比较大,程序中的变量比较多时,这一点就显得尤其重要。这就是 结构化程序设计所强调的编程风格问题。在数学里人们常常采取对变量简单命名 的方式,那是因为数学公式里使用的变量通常都很少。程序的情况则不同,一个 大程序里可能有成百成千的变量,命名问题就显得重要。整型数据及其表示1. 整数类型C 语言提供了多种整数类型,用以适应不同情况的需要。常用的整数类型有: 整型、长整型、无符号整型和无符号长整型等四种基本类型。不同类型的差别就 在于采用不同位数的二进制编码方式,所以就要占用不同的存储空间,就会有不 同的数值表示范围。表 3-1

10、 列出了常用的基本整数类型和有关数据。在数学中,整数是一个无限的集合,即整数的表示范围为-+C语言 标准本身也并不限制各种类型数据所占的存储字节数。但在计算机中,所有数值 的取值范围受限于机器所能表示的范围,不同的计算机系统对数数据的存储有具 体的规定。表 3-1 列出了 IBM PC 机及其兼容机上对 C 语言整型数的规定,表中 的存储字节数和最小数值范围表示相应类型的整数不能低于此值但可高于此值。 表 3-1 整数基本类型表 整数类型 存储字节 最小数值范围 整型 2 字节 -3276832767 长整型 4 字节 -21474836482147483647 无符号整型 2 字节 0655

11、35 无符号长整型 4 字节 04294967295计算机内部总是采用二进制补码形式表示一个数值型数据,所以对于带符号 的数,其负数的表示范围比正数大,请读者注意这一点。表3-2 中的整型和长整 型均表示带符号的整型数据,一个带符号整数和无符号整数在计算机中的存储形 式是不同的,其示意图如图3-1 所示。例如,长整型不可少于四个字节,但可以 是八个字节。整型数无符号整型敷4用全部1百位表示数值屮表示-1的补码*表示數值65J353-1整型数据存储示意图卩图中的整型数和无符号整型数都是用两个字节(16位二进制数)表示,整 型数的最高位为符号位,1表示负数,0表示正数,用其余15位表示数值。 而无

12、符号整型数全部16位表示数值。2. 整型常量在计算机语言中,常量一般是以自身的存在形式直接表示数据属性,C语言 亦如此。例如:-35是十进制整型常数,应占两个字节的存储空间,而-35.0是十 进制实型常数,占四个字节的存储空间。在C语言中,所有的数值型常量都带有符号,所以整型常量只区别整型和 长整型两种形式,而没有无符号值型常量。整型和长整型常量均可用十进制、八 进制和十六进制三种形式表示。(1) 十进制整型常量十进制整型常量的形式是有效的十进制数字串。如:123, -123, 8, 0, -5, 30000等。40000则不是一个十进制整型常量,因为它超过了整型常量的表示范 围。对于这种超过

13、数值表示范围的数据,语言系统会自动将其转换为其它适合的 类型。(2) 八进制整型常量八进制整型常量的形式是以数字0开头的八进制数字串。数字串中只能含 有07这八个数字。如:056 表示八进制数56,等于十进制数46。-017表示八进制数-17,等于十进制数-15。(3) 十六进制整型常量十六进制整型常量的形式是以数字0x或0X开头的十六进制字符串。字符串中只能含有09这十个数字和d、b、c、d、e、f (或大写的A、B、 C、D、E、F )这六个字母。这一规定与计算机领域中通行的表示十六进制字 符方式相同。如:0x123表示十六进制数123,等于十进制数291。0x3A表示十六进制数3A,等于

14、十进制数58。-0x2e表示十六进制数-2f,等于十进制数-46。以上是整型常数的表示,对于长整型常数同样可以用十进制、八进制和十六 进制三种形式表示。其表示形式是在常数之后加上字母1 或L。例如:123L, -1234567L, 0l, 32769L, -017l, -0x123BL, 0Xf3acL, -0x2eL 都是长整型常数。长整型常数在计算机中占4个字节,数的表示范围可达到-2147483648 2147483647。所以尽管40000不是一个合法的十进制整型常量,但40000L是一 个合法的十进制长整型常量。长整型常数一般是用于函数调用中。3. 整型变量在 C 语言中,整型变量有

15、上述整型数据所具有的四种类型:整型、长整型、 无符号整型和无符号长整型。整型变量以关键字int作为基本类型说明符,另外 配合4个类型修饰符,用来改变和扩充基本类型的含义,以适应更灵活的应用。 可作用于基本型int上的4个类型修饰符有:long长short短signed 有符号unsigned 无符号这些修饰符与int可以组合成如表3-2所示的不同整数类型,这是ANSI C 标准允许的整数类型。由表中可见,有些修饰符是多余的,例如修饰符signed 和 short 就是不必要的,因为 signed int、 short int、 signed short int 与 int 类型都是 等价的。提

16、出这些修饰符只是为了提高程序的可读性。因为signed与unsigned 对应,short与long对应,使用它会使程序看起来更加明了。表3-2 ANSI标准规定的整型变量属性表数据类型 占用字节数 二进制位 取值范围int 216 -32768 32767short int 216 同 intsigned int 216 同 intsigned short int 216 同 intsigned long int 432 同 long intunsigned int 216 065535unsigned short int 216 同 unsigned intunsigned long in

17、t 432 04294967295前面已经提到,一个C程序中用到的所有变量都必须在使用前进行变量说 明。一是说明变量类型,二是说明变量名。对于程序中要说明为整型的变量,只 需在说明语句中指明整型数据类型和相应的变量名即可。例如:int a,b,c; /*说明a,b,c为整型变量*/long e,f; /* 说明 e,f 为长整型变量 */unsigned short g,h; /* 说明 g,h 为无符号短整型变量 */signed int x,y; / *说明x,y,z为带符号整型变量,其作用同int x,y */4. 整型数据应用中的几个问题 整型数据在使用中应注意以下几个问题:(1) 变

18、量要先定义后使用;(2) 数据溢出;(3) 常量与变量的类型要匹配。 下面通过一个简单的程序实例讨论以上三个问题。例 3-1:编写求两数和的 C 程序并上机运行。程序如下:/* SUM.C 源程序 */main() /* 求两数和主函数 */int a,b; /* 说明 a、b 为整型变量 */a=32767; /* 为变量 a 赋最大值 */b=3; /* 为变量 b 赋值 */c=a+b; /* 计算 a+b 并将结果赋值给变量 c */printf(c=%dn,c); /* 输出变量 c 的值 */讨论1:在Turbo C2.0开发环境下运行此程序时,编译过程中提示有一个错误,信息窗口显

19、示如图3-2所示的错误信息,说明源程序第五行有错,错误原因 是主程序中的变量C没有定义。编辑窗口源程序反相显示出第五行,见图3-3 所示。分析错误原因可知,程序第五行并没有错,而是在使用变量c之前没有定 义其类型,修改程序第二行为:int a,b,c;重新编译即可通过。可见,C程序中的所有变量都必须先定义后使用。MessageError C:TC SIIM-C 5: Undefined symbol JcJ in function ma inE3-2 SUH.C程序編译出错信息讨论2:由SUM.C源程序可见,该程序的运行结果应该是:c=32770,可实际运行结果如下:c=-32766File

20、Edit Run CcLine 5 Col 5 main() tint a,b; a=327i7;printfClc=i?(lnll,c);H3-3 SUM.C源程序編辑窗口屮显然这个结果是错误的,但系统没有提示出错。为什么会出现这种情况呢? 图3-4是该程序运行后变量a、b、c中的存储情况。由图中可见,a和b的值都 没有超出整型数的表示范围,而a加b后应得到32770,这个数已经超出了整型 数的表示范围,称为溢出。但这种溢出在内存变量c中的表现形式正好是数值 -32766的补码形式,当输出变量c的内容时自然就输出了-32766,造成结果错误。 这就是数据溢出导致的结果。对于这种问题,系统往往

21、不给出错误提示,而是要 靠正确使用类型说明来保证其正确性。所以要求对数据类型的使用要仔细,对运 算结果的数量级要有基本估计。a111111110000000000000c111000000a0001变量变量tl变量cP團工4两数栢加变星存储示意團门32767-3276的补码心如果把上述程序作以下修改:/* SUM.C源程序*/main()long a,b,c; /*说明a、b、c为长整型变量*/a=32767;b=3;c=a+b;printf(c=%ldn,c); /*按长整型格式输出变量c的值*/即把变量a、b、c定义为长整型,就可以得到正确的运行结果。请读者思考: 如果只把c定义为长整型,

22、a和b还保持整型,结果会怎样?讨论3:在C程序中,要注意常量与变量的类型匹配问题,例如上述程序中 变量c的结果是正整数32770,与之匹配的有long int型,还有unsigned int、 unsigned short int和unsigned long int等所有无符号整型,因为32770是正数,又 没有超出所有无符号整型数的表示范围。而int或short int型是不能与之匹配的, 否则会产生溢出。3.2.3实型数据及其表示1实数类型C语言提供了三种用于表示实数的类型:单精度型、双精度型和长双精度型。 表3-3列出了实型数据的长度和表示范围。表中的有效位是指数据在计算机中存 储和输出

23、时能够精确表示的数字位数。表3-3实数基本类型表实数类型存储字节数最小数值范围有效位单精度型4字节10-381038 67双精度型8字节10-30810308 1516长双精度型16字节10-4931104932 1819在计算机中,实数是以浮点数形式存储的,所以通常将单精度实数称为浮点 数。由计算机基础知道,浮点数在计算机中是按指数形式存储的,即把一个实型 数据分成小数和指数两部分。例如十进制实型数据0.123456 10-2在计算机中的 存放形式可用图3-5示意。实际上计算机中存放的是二进制数,这里仅用十进制 数说明其存放形式。数符卜小数-指数符号指数-十0.1234562_ - 丿小数部

24、分指数部分區1=5寰製熱在计算机中的存放形式-其中,小数部分一般都采用规格化的数据形式,即:小数点放在第一个有效 数字前面,使小数部分存放小于1的纯小数。例如0.123456 10-2还可表示为 123.456 10-5、1.23456 10-3、0.000123456 101 等,但这些都不是规格化的数。表示小数部分的位数愈多,数的有效位就愈多,数的精确度就愈高。表示指 数部分的位数愈多,数的表示范围就愈大。究竟用多少位来表示小数部分,多少 位表示指数部分,C标准对此并无具体规定,由各C编译系统自定。对于单精度 实数,一般的C编译系统用4个字节中的前24位表示小数部分,其中最高位为 整个数的

25、符号位,用后8位表示指数部分,其中最高位为指数的符号位(见图 3-5)。这样,单精度实数的精度就取决于小数部分的23位二进制数位所能表达 的数值位数,将其转换为十进制,最多可表示7位十进制数字,所以单精度实数 的有效位是7位。由实型数据的存储形式可见,由于机器存储位数的限制,浮点数都是近似值, 而且多个浮点数运算后误差累积很快,所以引进了双精度型和长双精度型,用于 扩大存储位数,目的是增加实数的长度,减少累积误差,改善计算精度。2. 实型常量实型常量亦被称为实型数或浮点数。在C语言中,实型常量一般都作为双精 度来处理,并且只用十进制数表示。实型常量有两种书写格式:小数形式和指数 形式。(1)小

26、数形式:它由符号、整数部分、小数点及小数部分组成。例如以下都是合法的小数形式实型常量: 12.34,0.123,.123, 123.,-12.0,-0.0345,0.0,0. 注意其中任何位置上的小数点都是不可缺少的。例如 123.不能写成 123,因为 123 是整型常量,而 123.是实型常量。(2) 指数形式:由十进制小数形式加上指数部分组成,其形式如下: 十进制小数e指数 或:十进制小数E指数格式中的e或E前面的数字表示尾数,e或E表示底数10,而e或E后面 的指数必须是整数,表示10的幂次。例如25.34e3表示25.34x103=25340。以下 都是合法的指数形式实型常量:2.5

27、e3, -12.5e-5, 0.123E-5, -267.89E-6, 0.61256e3注意指数必须是不超过数据表示范围的正负整数,并且在e或E前必须有数 字。例如:e3, 3.0e, E-9, 10e3.5, .e8, e 都是不合法的指数形式。对于上述两种书写形式,系统均默认为是双精度实型常量,可表示1516 位有效数字,数的表示范围可达到10-30810308。如果要表示单精度实型常 量和长双精度实型常量,只要在上述书写形式后分别加上后缀f(F)或1(L)即可。 例如:2.3f, -0.123F, 2e-3f, -1.5e4F 为合法的单精度实型常量,注意只有7位有 效数字。1256.

28、34L,-0.123L,2e3L,为合法的长双精度实型常量,有1819位有效 数字。对于超过有效数字位的数位,系统存储时自动舍去。3. 实型变量在 C 语言中,实型变量分为单精度、双精度和长双精度等三种类型。 ANSI C 标准允许的定义三种实型变量的关键字如下:float 单精度型double-双精度型long double-长双精度型实型变量的定义,只需在说明语句中指明实型数据类型和相应的变量名即 可。例如:float a,b; /*说明变量a,b为单精度型实数*/double c,d; /*说明变量c,d为双精度型实数*/long double e,f /* 说明变量 e,f 为长双精度

29、型实数 */4. 实型数据应用中的误差问题例 3-2:输出实型数据 a,b/* L3_2.C 源程序 */main()float a; /*说明变量a为单精度型*/double b; /*说明变量b为双精度型*/a=12345.6789; /* 为 a 赋值 */b=0.1234567891234567899e15; /* 为 b 赋值 */printf(a=%f,b=%fn,a,b); /* 输出变量 a、b 的值 */程序为单精度变量a和双精度变量b分别赋值,并不经过任何运算就直接输 出变量a,b的值。理想结果应该是照原样输出,即:a=12345.6789, b=0.1234567891234567899e15但运行该程序,实际输出结果是:a=12345.678711, b=123456789123456.797000由于实型数据的有效位是有限的,程序中变量a为单精度型,只有7位有效 数字,所以输出的前8位是准确的,第9位以后的数字711是无意义的。变量b 为双精度型,可有1516位的有效位,所以输出的前16位是准确的,第17位 以后的数字97000是无意义的。由此可见,由于机器存储的限制,使用实型数 据会产生一些误差,运算次数愈多,误差积累就愈大,所以要注意实型数据的有 效位,合理使用不同的类型,尽可能减少误差。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!