整型字符型与浮点型课件

上传人:痛*** 文档编号:241408303 上传时间:2024-06-23 格式:PPT 页数:51 大小:274KB
返回 下载 相关 举报
整型字符型与浮点型课件_第1页
第1页 / 共51页
整型字符型与浮点型课件_第2页
第2页 / 共51页
整型字符型与浮点型课件_第3页
第3页 / 共51页
点击查看更多>>
资源描述
第4章 整型、字符型与浮点型v各种整型数据类型的使用;v各种字符型数据类型的使用;v各种浮点型数据类型的使用;v使用printf函数和scanf函数处理各种类型数据;v使用typedef自定义数据类型;vconst和volatile的使用。4.1 整型数据类型vC语言定义了4种整型数据类型以表示不同大小的整数数值。vshort int,短整型vint,整型vlong int,长整型vlong long int,长长整型4.1.1 字节长度v在不同的编译器和不同的硬件环境中,不同整型的字节长度可能不同。但是都具有以下关系,short int的长度不大于int的长度,int的长度不大于long int的长度,long int的长度不大于long long int的长度。范例4-1可以得到各种整数数据类型的字节长度。4.1.2 修饰符signed和unsignedvsigned和unsigned称为符号修饰符,可以用来作为上面四种整型数据类型的前缀,以组成有符号整数和无符号整数,如下所示:vsigned short int,unsigned short int,vsigned int,unsigned int,vsigned long int,unsigned long int,vsigned long long int,unsigned long long intv带signed前缀的数据类型和无符号修饰符的整型一样,都可以表示所有整数;而有unsigned修饰的数据类型都只能用来表示无符号数,即非负整数。4.1.3 整型常量v整型常量是指用以表示整型数值的常量,可以分为短整型(short int)、整型(int)、长整型(long int)和长长整型(long long int)四种。表4-1是数值为74的不同进制的整型常量的表示形式。4.1.3 整型常量v与作为数据类型后缀不同的是,在printf函数和scanf函数中,当长度修饰符和符号修饰符都存在时,位置不能互换。v符号修饰符与进制符不能共存。v进制符有5种:d、x、X、o和i。d表示十进制,x和X表示十六进制,o表示八进制,i表示三种进制中任意一种。4.1.3 整型常量v其中十六进制符(x和X)中,进制符x只能接受09和小写字母af,进制符X只能接受09和大写字母AF。v例如,把长长整型十六进制数FFFFFFFFFF以八进制形式输出,如下所示:vprintf(%llon,0 xFFFFFFFFFFll);v输出结果为:v177777777777774.1.4 整型变量v整形变量是指用以存储整型数值的变量。与整型常量一样,整型变量也可以分为短整型、整型、长整型和长长整型四种类型;并且每种类型都可以分为有符号和无符号两种,而有符号数与没有符号前缀的变量完全一样。各类型的定义形式如下:v signed short int data_h;vunsigned short int data_uh;v signed int data_d;vunsigned int data_ud;v signed long int data_l;vunsigned long int data_ul;v signed long long int data_ll;vunsigned long long int data_ull;4.1.5 整型的存储方式v整型按照存储方式和数值区间的不同,可分为两大类:有符号整型和无符号整型。其中,有符号整型在内存中的存储分为两部分:符号部分和数值部分。例如,int型在内存中的存储形式如下图所示。4.1.5 整型的存储方式v例如,unsigned int型在内存中的存储形式如下图所示。4.1.6 整型的数值范围v在前面的讨论中,可以知道不同整型数据的字节长度不同,因此它们的可表示的数值范围也是不同的,如下表所示。4.1.6 整型的数值范围v所有变量在内存中的存储状况如下表所示。4.1.6 整型的数值范围v程序中4个变量均赋值为其数据类型所能表示范围的边界值,存储状态如下表所示。当再增加或减小这些变量的值时,数据将溢出。4.1.6 整型的数值范围v【代码解析】同样,本程序中4个变量也都被赋值为其数据类型所能表示范围的边界值,存储状态如下表所示。同样,当增加或减小这些变量的值时,数据将溢出。4.2 字符型数据类型vC语言中的字符型数据只有一种,即char型数据类型,因此也直接把char型称为字符型。使用符号修饰符还可以得到无符号字符型和有符号字符型,如下所示:v signed char,有符号字符型vunsigned char,无符号字符型v本节将先讨论字符型的字节长度,再讨论了字符常量和字符变量的使用,最后介绍了字符型的存储方式。4.2.1 字节长度v在C标准中,char型的字节长度被定义为1位。与整型数据类型一样,也可以使用符号修饰符来得到无符号char型和显式的有符号char型,它们的字节长度都是一样的。4.2.2 字符常量v字符常量,即用以表示字符的常量。C语言中的字符常量都包含在单引号中,单引号内具体的内容可分为两种:v1单个字符v单个字符常量是指单引号内只含一个字符的常量,例如:va,b,1,mv这些字符常量输出到屏幕上的结果即为引号内的字符本身。v2转义字符v以反斜杆()开头的转义字符,其作用是把反斜杆后面的字符转换为特定形式。比如:vn,t,123,x124.2.2 字符常量v下表列出了常用的转义字符的含义。4.2.2 字符常量v由于字符常量只占1个字节,因此该类型只能表示256个值。正因为字符型可表示的数值个数有限的特点,在C标准中,字符常量的0127部分被一一映射为ASCII码。4.2.3 字符变量v字符变量是用以存储字符型数值的变量。字符型变量也有两种:有符号型和无符号型。定义形式如下:v signed char ch1;vunsigned char ch2;v对字符型变量赋值有两种方式。一种是使用字符常量,比如:vchar c1=n;vunsigned c2=n;4.2.3 字符变量v另一种是使用整型赋值,整型会自动转化为相应的ASCII码复制给字符变量。比如:vchar c1=97;*即a*vunsigned c2=49;*即1*vprintf函数和scanf函数对字符型数据的处理格式为%c。4.2.4 字符型的存储方式v字符型数据类型的存储方式和整型十分相似。v有符号字符型和有符号整型一样,最高位为符号位,其余部分都属于数值部分,其值等于该字符型数据的数值的绝对值。v无符号字符型只含数值部分。4.3 浮点型数据类型vC语言共定义了如下三种浮点型数据类型以表示不同精度不同数值范围的浮点数。vfloat,单精度型vdouble,双精度型vlong double,长双精度型4.3.1 字节长度vC标准中对不同浮点型的字节长度有以下规定:float型不大于double型,double型不大于long double型。在不同编译器和不同硬件环境下,各类型的字节长度有所变化。4.3.2 浮点型常量v浮点型常量是用以表示浮点数值的常量。浮点型常量有三种类型:float型常量、double型常量和long double型常量。C语言中的浮点型数值默认为双精度类型,可以使用f或F作为后缀得到单精度型常量,或使用l或L作为后缀得到长双精度常量。它们的表示有小数形式和指数形式两种形式。v小数形式的示例有:1500.13、3.1415926、-0.007。v指数形式有三部分,数值1、e或E、数值2,其值等于(数值1)(10的(数值2)次方)。上述小数形式的示例用指数表示依次为:1.50013e3,31415.926E-4,-0.7e3,中间的e大小写均可。4.3.2 浮点型常量v浮点型常量的整数部分为0时,省略整数部分的0也是合法的,比如:-0.007可以写为-.007,-0.7e3可以写为-.7e3。v指数形式中,e前面必须有数字,数值2必须存在且为整数。以下形式是非法的:v1.e7e前面必须紧挨着数字v0.77e3.2e后面必须为整数ve2e前必须有数字v2ee后面必须有整数4.3.3 浮点型变量v浮点型变量是用以存储浮点型数值的变量。C语言中定义了三种浮点型变量:float型变量(单精度变量),double型变量(双精度变量)和long double型变量(长双精度变量)。下面是这几种浮点类型定义变量的形式如下:vfloat f;vdouble d;vlong double ld;4.3.3 浮点型变量v从前面的讨论可以知道,基本上,三种类型所占的字节长度是不一样的,因此它们能表示的精度和数值范围也是不一样的,如下表所示。4.3.4 浮点型的精度v不同浮点型的精度不同,精度从低到高依次为float型、double型和long double型。下面的程序可以检测三种浮点型的精度。4.3.5 浮点型的数值范围v不同浮点型可以表示的数值范围也不同,由于浮点型在内存中是以科学计数法的方式来存储的,因此其数值范围只能使用数量级范围来表示。可表示的数量级范围从小到大为依次为:float型、double型和long double型。4.3.6 浮点型的存储方式v浮点型的存储方式和其他类型有很大不同,而不同编译器之间也存在差别,但大部分都遵从IEEE数值标准。下面以Linux下的GCC 3.2.2的实现为例,讨论浮点型的存储方式。v浮点型的内存形式包含3个部分:v1符号位v浮点型的符号位只有一位,为其最高位。如果该位为1,则表示其为负数;如果该位为0,则表示其为非负数。4.3.6 浮点型的存储方式v2指数位v浮点型的指数位以补码形式存储其科学计数法表示形式的指数部分。指数位决定浮点型可存储的数值范围。但是,需要注意的是,浮点型数据的内存形式中的指数位的值并非真正的指数值,真正的指数值为该类型的偏差值减去该存储值的结果。偏差值是为了校正指数值而设定的,每种类型的偏差值是固定的,不同类型的偏差值不同。4.3.6 浮点型的存储方式v3基数位v基数位是浮点型的最后一部分,其位数决定精确度。long double型的基数位即为其科学计数法的基数位的二进制表示形式。float型和double型的基数位与long double型略有不同。由于科学计数法的基数表示为二进制时,由于二进制中除了0即为1,故可以确定其整数位肯定为1。因此,为了得到多一位的存储空间,存储float型和double型数据时,省去基数的整数位,而默认其整数位为1。4.3.6 浮点型的存储方式v在不同浮点型中,这三个部分所占空间不同,下表列出了vGCC中各浮点类型的分段情况。4.4 使用typedef定义类型v除了前几节介绍的C语言自带的数据类型外,程序员还可以使用关键字typedef定义自己的数据类型。本节将介绍typedef语句的作用以及如何在C中合理使用typedef语句。4.4.1 typedef的标准形式vtypedef作用是为数据类型起一个新的名字。typedef语句由三个部分组成:关键字typedef、原数据类型名和新数据类型名。其标准形式如下:v/*typedef 原数据类型 新数据类型*/vtypedef oldType newType;v其在后面的程序中,便可以使用newType来代替oldType。执行typedef语句后,编译器会将程序中遇到的newType使用oldType来代替。例如:vtypedef char myChar;vmyChar c=c;4.4.1 typedef的标准形式vC语言还允许对新的数据类型名再次使用typedef,即对别名再起一个别名。例如:vtypedef int myInt_t;vtypedef myInt myInt32;/*正确*/v程序中的myInt32将先被替代为myInt,而myInt的原型为int,所以myInt32最后又被int替代。但是所有的新数据类型名只能单独组成数据类型,不能作为其他数据类型的一部分。v(接上面的程序)vtypedef unsigned int IntU_t;/*正确*/vtypedef unsigned myInt myIntU_t;/*错误:不可将别名作为其他数据类型的一部分*/vmyInt32 a;/*正确*/vunsigned myInt32 b;/*错误:不可将别名作为其他数据类型的一部分*/4.4.2 合理使用typedefv使用typedef一般有以下几个用途:1简化复杂的类型申明v使用typedef给名字较长的数据类型起一个简短的名字,简化书写。比如:vtypedef unsigned long long int LLU_t;vtypedef的这个特点,在后面章节中讨论到复杂数据类型和复杂指针时会得到更好的体现。2提高程序的可维护性和移植性v在程序中,对于一些数据类型可能会改变的变量,一般都使用数据类型别名来申明该变量。比如,一个学生成绩管理系统中,学生的各科成绩最初要求处理为整数。因此,程序中与成绩相关的所有变量都定义为int,如下所示:vint math;v后来,需求发生了变化,学生的成绩有可能含有小数,此时就需要改变与成绩相关的所有变量的定义,都改为float型。如下所示:vfloat math;2提高程序的可维护性和移植性v这样的修改相当麻烦,费时。但是如果在最初的设计中,将所有类型可能变化的变量在定义前为其量身定制一个数据类型的话,将大大提高程序的可维护性。vtypedef int score_t;vscore_t math;vscore_t phy;vscore_t engl;vvscore_t score_tmp;v当系统要求成绩为小数时,则只需改变typedef语句。vtypedef float score_t;3定义自己的数据类型集v在一些程序中,为了提高程序的可维护性和可移植性,经常需要自定义一些数据类型集。比如下面这段代码展示了如何使用typedef定义一套完整的整数类型集。3定义自己的数据类型集v01/*使用typedef定义8位、16位、32位和64位的整数类型*/v02typedef charint8_t;/*定义8位整数*/v03typedef shortint16_t;/*定义16位整数*/v04typedef intint32_t;/*定义32位整数*/v05typedef long longint64_t;/*定义64位整数*/v06typedef unsigned charuInt8_t;/*定义无符号8位整数*/v07typedef unsigned shortuInt16_t;/*定义无符号16位整数*/v08typedef unsigned intuInt32_t;/*定义无符号32位整数*/v09typedef unsigned long longuInt64_t;/*定义无符号64位整数*/3定义自己的数据类型集v在程序中可以使用这套整数类型集来代替C语言的内建整数类型。但系统发生变化时,比如在新系统中,int型的支持位数只有16位,而long int型的支持位数有32位,那么只需修改上述整数集中的int32_t和uInt32_t的typedef。如下所示:vvtypedef long int32_t;vvtypedef unsigned long uInt32_t;v4.5 限定词const与volatilev关键字const与volatile是C语言中的两个数据类型限定词,均在变量定义中使用。把一个变量定义为const,意味着该变量的值将不会被改变,而把一个变量定义为volatile,则告诉编译器不要对该变量进行优化。本节将先后讨论限定词const和volatile的使用。4.5.1 使用constv限定词const在C语言中的主要作用是定义只读变量。只读变量的值在定义后不能再被改变。使用const的形式如下:vconst 数据类型名 变量名=初始值;v也可以把关键字const放在数据类型名和变量名中间,如下所示:v数据类型名 const 变量名=初始值;v下面是几个定义const变量的实例:vconst int NUM_MONTH=12;vconst double PI=3.1415926;vconst char RIGHT=T;vconst char WRONG=F;4.5.1 使用constv使用const变量有以下4个好处:v1提高程序的可读性v2提高程序的可维护性v3避免只读变量被意外修改v4提高程序效率4.5.2 使用volatilev限定词volatile告诉编译器其修饰的变量是随时可能变化的,编译器优化时必须每次都重新读取这个变量的值,而不是使用保存在寄存器里的备份。例如:v01 int main(void)v02int data=10;v03int a,b;v04v05a=data;v06/*中间不对data进行操作*/v07b=data;v08 v09 4.5.2 使用volatilev除了无需初始化,volatile的使用语法和const一样,其标准使用形式为:vvolatile 数据类型名 变量名;v或v数据类型名 volatile变量名;v例如,上述例子中把变量data定义为volatile的语句如下:vvolatile int data=10;v此外,可以使用限定词const和volatile同时修饰一个变量,如下所示:vconst volatile int data=10;4.6 综合练习v1.设计一个程序,要求输入一个char型、一个int型和一个float型数据,再将其输出。【提示】使用scanf函数来实现数据输入,使用printf函数来实现数据输出。4.6 综合练习v2请设计一个程序,将输入的小写字母对应的大写字母输出。v【提示】查看ASCII码表,观察小写字母和大写字母排放的位置,可以发现每一个小写字母与其大写字母的差值都是一样的,为32。该值可以使用表达式(a-A)求得。v3设计一个程序来验证浮点数的精度损失。v【提示】将一个有效数字位数超过8位的数值赋值给一个float型变量,该变量得到的值为数值损失后的结果。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


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

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


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