




已阅读5页,还剩47页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 整型、字符型与浮点型,本章将重点介绍C语言提供的三组基本数据类型的使用,包括:整型、字符型和浮点型。C语言中的其他高级数据类型实质上都可以视为这些基本数据类型的组合。通过本章的学习,要掌握以下知识:,第4章 整型、字符型与浮点型,各种整型数据类型的使用; 各种字符型数据类型的使用; 各种浮点型数据类型的使用; 使用printf函数和scanf函数处理各种类型数据; 使用typedef自定义数据类型; const和volatile的使用。,4.1 整型数据类型,C语言定义了4种整型数据类型以表示不同大小的整数数值。 short int,短整型 int,整型 long int,长整型 long long int,长长整型,4.1.1 字节长度,在不同的编译器和不同的硬件环境中,不同整型的字节长度可能不同。但是都具有以下关系,short int的长度不大于int的长度,int的长度不大于long int的长度,long int的长度不大于long long int的长度。范例4-1可以得到各种整数数据类型的字节长度。,4.1.2 修饰符signed和unsigned,signed和unsigned称为符号修饰符,可以用来作为上面四种整型数据类型的前缀,以组成有符号整数和无符号整数,如下所示: signed short int, unsigned short int, signed int, unsigned int, signed long int, unsigned long int, signed long long int, unsigned long long int 带signed前缀的数据类型和无符号修饰符的整型一样,都可以表示所有整数;而有unsigned修饰的数据类型都只能用来表示无符号数,即非负整数。,4.1.3 整型常量,整型常量是指用以表示整型数值的常量,可以分为短整型(short int)、整型(int)、长整型(long int)和长长整型(long long int)四种。表4-1是数值为74的不同进制的整型常量的表示形式。,4.1.3 整型常量,与作为数据类型后缀不同的是,在printf函数和scanf函数中,当长度修饰符和符号修饰符都存在时,位置不能互换。 符号修饰符与进制符不能共存。 进制符有5种:d、x、X、o和i。d表示十进制,x和X表示十六进制,o表示八进制,i表示三种进制中任意一种。,4.1.3 整型常量,其中十六进制符(x和X)中,进制符x只能接受09和小写字母af,进制符X只能接受09和大写字母AF。 例如,把长长整型十六进制数FFFFFFFFFF以八进制形式输出,如下所示: printf(“%llon“, 0xFFFFFFFFFFll); 输出结果为: 17777777777777,4.1.4 整型变量,整形变量是指用以存储整型数值的变量。与整型常量一样,整型变量也可以分为短整型、整型、长整型和长长整型四种类型;并且每种类型都可以分为有符号和无符号两种,而有符号数与没有符号前缀的变量完全一样。各类型的定义形式如下: signed short int data_h; unsigned short int data_uh; signed int data_d; unsigned int data_ud; signed long int data_l; unsigned long int data_ul; signed long long int data_ll; unsigned long long int data_ull;,4.1.5 整型的存储方式,整型按照存储方式和数值区间的不同,可分为两大类:有符号整型和无符号整型。其中,有符号整型在内存中的存储分为两部分:符号部分和数值部分。例如,int型在内存中的存储形式如下图所示。,4.1.5 整型的存储方式,例如,unsigned int型在内存中的存储形式如下图所示。,4.1.6 整型的数值范围,在前面的讨论中,可以知道不同整型数据的字节长度不同,因此它们的可表示的数值范围也是不同的,如下表所示。,4.1.6 整型的数值范围,所有变量在内存中的存储状况如下表所示。,4.1.6 整型的数值范围,程序中4个变量均赋值为其数据类型所能表示范围的边界值,存储状态如下表所示。当再增加或减小这些变量的值时,数据将溢出。,4.1.6 整型的数值范围,【代码解析】同样,本程序中4个变量也都被赋值为其数据类型所能表示范围的边界值,存储状态如下表所示。同样,当增加或减小这些变量的值时,数据将溢出。,4.2 字符型数据类型,C语言中的字符型数据只有一种,即char型数据类型,因此也直接把char型称为字符型。使用符号修饰符还可以得到无符号字符型和有符号字符型,如下所示: signed char,有符号字符型 unsigned char,无符号字符型 本节将先讨论字符型的字节长度,再讨论了字符常量和字符变量的使用,最后介绍了字符型的存储方式。,4.2.1 字节长度,在C标准中,char型的字节长度被定义为1位。与整型数据类型一样,也可以使用符号修饰符来得到无符号char型和显式的有符号char型,它们的字节长度都是一样的。,4.2.2 字符常量,字符常量,即用以表示字符的常量。C语言中的字符常量都包含在单引号中,单引号内具体的内容可分为两种: 1单个字符 单个字符常量是指单引号内只含一个字符的常量,例如: a, b, 1, m 这些字符常量输出到屏幕上的结果即为引号内的字符本身。 2转义字符 以反斜杆()开头的转义字符,其作用是把反斜杆后面的字符转换为特定形式。比如: n, t, 123, x12,4.2.2 字符常量,下表列出了常用的转义字符的含义。,4.2.2 字符常量,由于字符常量只占1个字节,因此该类型只能表示256个值。正因为字符型可表示的数值个数有限的特点,在C标准中,字符常量的0127部分被一一映射为ASCII码。,4.2.3 字符变量,字符变量是用以存储字符型数值的变量。字符型变量也有两种:有符号型和无符号型。定义形式如下: signed char ch1; unsigned char ch2; 对字符型变量赋值有两种方式。一种是使用字符常量,比如: char c1 = n; unsigned c2 = n;,4.2.3 字符变量,另一种是使用整型赋值,整型会自动转化为相应的ASCII码复制给字符变量。比如: char c1 = 97; * 即a * unsigned c2 = 49; * 即1 * printf函数和scanf函数对字符型数据的处理格式为%c。,4.2.4 字符型的存储方式,字符型数据类型的存储方式和整型十分相似。 有符号字符型和有符号整型一样,最高位为符号位,其余部分都属于数值部分,其值等于该字符型数据的数值的绝对值。 无符号字符型只含数值部分。,4.3 浮点型数据类型,C语言共定义了如下三种浮点型数据类型以表示不同精度不同数值范围的浮点数。 float,单精度型 double,双精度型 long double,长双精度型,4.3.1 字节长度,C标准中对不同浮点型的字节长度有以下规定:float型不大于double型,double型不大于long double型。在不同编译器和不同硬件环境下,各类型的字节长度有所变化。,4.3.2 浮点型常量,浮点型常量是用以表示浮点数值的常量。浮点型常量有三种类型:float型常量、double型常量和long double型常量。C语言中的浮点型数值默认为双精度类型,可以使用f或F作为后缀得到单精度型常量,或使用l或L作为后缀得到长双精度常量。它们的表示有小数形式和指数形式两种形式。 小数形式的示例有:1500.13、3.1415926、-0.007。 指数形式有三部分,数值1、e或E、数值2,其值等于(数值1)(10的(数值2)次方)。上述小数形式的示例用指数表示依次为:1.50013e3,31415.926E-4,-0.7e3,中间的e大小写均可。,4.3.2 浮点型常量,浮点型常量的整数部分为0时,省略整数部分的0也是合法的,比如:-0.007可以写为-.007,-0.7e3可以写为-.7e3。 指数形式中,e前面必须有数字,数值2必须存在且为整数。以下形式是非法的: 1.e7 e前面必须紧挨着数字 0.77e3.2 e后面必须为整数 e2 e前必须有数字 2e e后面必须有整数,4.3.3 浮点型变量,浮点型变量是用以存储浮点型数值的变量。C语言中定义了三种浮点型变量:float型变量(单精度变量),double型变量(双精度变量)和long double型变量(长双精度变量)。下面是这几种浮点类型定义变量的形式如下: float f; double d; long double ld;,4.3.3 浮点型变量,从前面的讨论可以知道,基本上,三种类型所占的字节长度是不一样的,因此它们能表示的精度和数值范围也是不一样的,如下表所示。,4.3.4 浮点型的精度,不同浮点型的精度不同,精度从低到高依次为float型、double型和long double型。下面的程序可以检测三种浮点型的精度。,4.3.5 浮点型的数值范围,不同浮点型可以表示的数值范围也不同,由于浮点型在内存中是以科学计数法的方式来存储的,因此其数值范围只能使用数量级范围来表示。可表示的数量级范围从小到大为依次为:float型、double型和long double型。,4.3.6 浮点型的存储方式,浮点型的存储方式和其他类型有很大不同,而不同编译器之间也存在差别,但大部分都遵从IEEE数值标准。下面以Linux下的GCC 3.2.2的实现为例,讨论浮点型的存储方式。 浮点型的内存形式包含3个部分: 1符号位 浮点型的符号位只有一位,为其最高位。如果该位为1,则表示其为负数;如果该位为0,则表示其为非负数。,4.3.6 浮点型的存储方式,2指数位 浮点型的指数位以补码形式存储其科学计数法表示形式的指数部分。指数位决定浮点型可存储的数值范围。但是,需要注意的是,浮点型数据的内存形式中的指数位的值并非真正的指数值,真正的指数值为该类型的偏差值减去该存储值的结果。偏差值是为了校正指数值而设定的,每种类型的偏差值是固定的,不同类型的偏差值不同。,4.3.6 浮点型的存储方式,3基数位 基数位是浮点型的最后一部分,其位数决定精确度。long double型的基数位即为其科学计数法的基数位的二进制表示形式。float型和double型的基数位与long double型略有不同。由于科学计数法的基数表示为二进制时,由于二进制中除了0即为1,故可以确定其整数位肯定为1。因此,为了得到多一位的存储空间,存储float型和double型数据时,省去基数的整数位,而默认其整数位为1。,4.3.6 浮点型的存储方式,在不同浮点型中,这三个部分所占空间不同,下表列出了 GCC中各浮点类型的分段情况。,4.4 使用typedef定义类型,除了前几节介绍的C语言自带的数据类型外,程序员还可以使用关键字typedef定义自己的数据类型。本节将介绍typedef语句的作用以及如何在C中合理使用typedef语句。,4.4.1 typedef的标准形式,typedef作用是为数据类型起一个新的名字。typedef语句由三个部分组成:关键字typedef、原数据类型名和新数据类型名。其标准形式如下: /* typedef 原数据类型 新数据类型 */ typedef oldType newType; 其在后面的程序中,便可以使用newType来代替oldType。执行typedef语句后,编译器会将程序中遇到的newType使用oldType来代替。例如: typedef char myChar; myChar c = c;,4.4.1 typedef的标准形式,C语言还允许对新的数据类型名再次使用typedef,即对别名再起一个别名。例如: typedef int myInt_t; typedef myInt myInt32; /* 正确 */ 程序中的myInt32将先被替代为myInt,而myInt的原型为int,所以myInt32最后又被int替代。但是所有的新数据类型名只能单独组成数据类型,不能作为其他数据类型的一部分。 (接上面的程序) typedef unsigned int IntU_t; /* 正确 */ typedef unsigned myInt myIntU_t; /* 错误:不可将别名作为其他数据类型的一部分 */ myInt32 a; /* 正确 */ unsigned myInt32 b; /* 错误:不可将别名作为其他数据类型的一部分 */,4.4.2 合理使用typedef,使用typedef一般有以下几个用途:,1简化复杂的类型申明,使用typedef给名字较长的数据类型起一个简短的名字,简化书写。比如: typedef unsigned long long int LLU_t; typedef的这个特点,在后面章节中讨论到复杂数据类型和复杂指针时会得到更好的体现。,2提高程序的可维护性和移植性,在程序中,对于一些数据类型可能会改变的变量,一般都使用数据类型别名来申明该变量。比如,一个学生成绩管理系统中,学生的各科成绩最初要求处理为整数。因此,程序中与成绩相关的所有变量都定义为int,如下所示: int math; 后来,需求发生了变化,学生的成绩有可能含有小数,此时就需要改变与成绩相关的所有变量的定义,都改为float型。如下所示: float math;,2提高程序的可维护性和移植性,这样的修改相当麻烦,费时。但是如果在最初的设计中,将所有类型可能变化的变量在定义前为其量身定制一个数据类型的话,将大大提高程序的可维护性。 typedef int score_t; score_t math; score_t phy; score_t engl; score_t score_tmp; 当系统要求成绩为小数时,则只需改变typedef语句。 typedef float score_t;,3定义自己的数据类型集,在一些程序中,为了提高程序的可维护性和可移植性,经常需要自定义一些数据类型集。比如下面这段代码展示了如何使用typedef定义一套完整的整数类型集。,3定义自己的数据类型集,01 /* 使用typedef定义8位、16位、32位和64位的整数类型 */ 02 typedef char int8_t; /* 定义8位整数 */ 03 typedef short int16_t; /* 定义16位整数 */ 04 typedef int int32_t; /* 定义32位整数 */ 05 typedef long long int64_t; /* 定义64位整数 */ 06 typedef unsigned char uInt8_t; /* 定义无符号8位整数 */ 07 typedef unsigned short uInt16_t; /* 定义无符号16位整数 */ 08 typedef unsigned int uInt32_t; /* 定义无符号32位整数 */ 09 typedef unsigned long long uInt64_t; /* 定义无符号64位整数 */,3定义自己的数据类型集,在程序中可以使用这套整数类型集来代替C语言的内建整数类型。但系统发生变化时,比如在新系统中,int型的支持位数只有16位,而long int型的支持位数有32位,那么只需修改上述整数集中的int32_t和uInt32_t的typedef。如下所示: typedef long int32_t; typedef unsigned long uInt32_t; ,4.5 限定词const与volatile,关键字const与volatile是C语言中的两个数据类型限定词,均在变量定义中使用。把一个变量定义为const,意味着该变量的值将不会被改变,而把一个变量定义为volatile,则告诉编译器不要对该变量进行优化。本节将先后讨论限定词const和volatile的使用。,4.5.1 使用const,限定词const在C语言中的主要作用是定义只读变量。只读变量的值在定义后不能再被改变。使用const的形式如下: const 数据类型名 变量名 = 初始值; 也可以把关键字const放在数据类型名和变量名中间,如下所示: 数据类型名 const 变量名 = 初始值; 下面是几个定义const变量的实例: const int NUM_MONTH = 12; const double PI = 3.1415926; const char RIGHT = T; const char WRONG = F
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 如何提高房地产项目的可持续性
- 环境灾害应急心理干预重点基础知识点归纳
- 环境经济项目合同履行风险控制重点基础知识点归纳
- 小学教学写作指导课件
- 如何维持烫发效果更持久
- 炸鸡店的现炸现做美食品鉴
- 幼儿的春节庆典淡蓝国潮故事
- 夏日妆容的打造方法
- 肯德基 质量控制美味无忧
- 肯德基的国际化战略实践
- 幼儿园大班语言课件:《毕业诗》
- 人教版二年级下册口算题天天练1000道可打印带答案
- 劳动力保证措施以及计划安排
- 江苏省南通市如皋市如城实验小学2023-2024学年五年级下学期期末模拟测试语文试卷
- 2021利达JB-QG-LD988EL JB-QT-LD988EL 火灾报警控制器 消防联动控制器调试手册
- 24春国家开放大学《班级管理》形考任务1-4参考答案
- 教育资源调查报告
- 手术室坠床跌倒应急预案
- 水稳基层双层连铺专项方案
- 园林绿化风险因素辨识及防控措施课件
- 国家职业技术技能标准 6-01-07-01 海盐制盐工 劳社厅发20031号
评论
0/150
提交评论