C04第2章数字化信息编码与C语言数据类型.ppt
新编C语言程序设计教程 清华大学出版社,周二强 软件学院 计算机科学与工程系配套视频:博客:,数字化信息编码与 C语言的数据类型,2.3 整型2.3.1 整型的分类2.3.2 整型字面量2.3.3 整型的输入输出2.4 浮点型2.4.1 浮点型的取值范围和精度 2.4.2 浮点型的分类2.4.3 浮点型字面量和浮点型数据的输入输出,2.5 字符型2.5.1 字符型数据的编码2.5.2 字符型字面量2.5.3 字符型数据的输入和输出,2.3.1 整型的分类,整型的基本类型符为int。整型的编码长度通常是一个机器字。在早期的16位机器如IBM Pc机上,整型(int)用2个字节编码,取值范围为-215215-1即-3276832767;而在32位机器上,整型(int)用4个字节编码,取值范围为-231231-1,即-21474836482147483647。,编码长度相对比较固定的整型,short int 类型(短整型),可简写为short,编码长度为2个字节,取值范围-3276832767。long int 类型(长整型),可简写为 long,编码长度为4个字节,取值范围-21474836482147483647。严格地说,整型只有两类short int 和long int,int与系统相关,但仅相当于其中的一个。VC6.0中,int的编码长度是4个字节,与long int等价。,“无符号”整型,修饰符unsigned加在整型前面就变成了“无符号”整型。所谓“无符号”整型,就是编码中取消了符号位,全部为数值位,因此“无符号”整型虽然不能编码负数,但是,它可以编码的正数的范围扩大了一倍。无符号整型有哪些呢?,“无符号”整型,unsigned short int(无符号短整型),简写为unsinged short,编码长度2个字节不变,取值范围0216-1(65535)。unsigned long int(无符号长整型),简写为unsinged long,编码长度4个字节不变,取值范围0232-1(4294967295)。unsigned int(无符号整型),等价于上面两个中的一个。,如何选择变量的类型?,数据的运算结果超出取值范围时就会因溢出而出错长整型的变量存储取值范围很小的数据又会造成内存空间的浪费,return,2.3.2 整型字面量,所谓字面量是指在编码的时候就已经确定的量。一个整数如23就是一个整型字面量。整型字面量默认也是有类型的 如果整型字面量的值在-3276832767范围内,则认为其是short型的;如果整型字面量的值超过了上述范围,而在-2147836482147483647范围内,则认为其是long型的。,整数字面量的后缀,字面量加上后缀l或L后被认为是长整型。,如23默认为是short型的,占两个字节,而23L则是long型的,占4个字节。整型字面量可以加上后缀u或U,表示它的类型为unsinged int(无符号整型)。整型字面量还可以加上u和l两后缀(次序、大小写不限),表示该字面量为无符号长整型。,整数字面量的注意事项,一,整型字面量究竟是何类型通常与编译系统相关,如字面量-1在TC中通常认为是short型,而在VC中通常认为是long型的。二,如果有初始化语句unsinged short i=-1u;,则-1会先转换成1111 1111 1111 1111的补码形式,然后-1的补码形式会存储到变量i标示的存储空间,即i的值是65535。这条语句也可写作unsinged short i=-1;。语句short i=-1u;和语句short i=65535;均应这样理解。,整数字面量的注意事项,三,在类型转换和表达式求值时,要特别注意字面量的类型,如:-1u-23的结果-1u是short型无符号数时其值为65535,因此-1u-23结果为65512,大于0,而-1-23的结果为-24小于0。,整型字面量的进制,在C语言中,使用前缀来标明一个整型字面量的进制。前缀为“0”的整数是八进制数如027为十进制的23;前缀为“0 x”或“0X”的整数是十六进制数如0 x17为十进制的23。十进制整数的前缀为空,即无前缀。如:语句int i=027,j=0 x17,k=0X17;定义了三个变量i、j、k,而且它们的值都被初始化为23了。,return,2.3.3 整型的输入输出,利用格式符串%d可以输出整型变量的值,也可把数据赋值给整型变量。利用格式字符d使用语句scanf(%d,把类似031这样的八进制字面量正确赋值给变量a可以吗?行不通!格式字符d只能用来输入或输出有符号的十进制整数与整型相关的常用格式字符还有i、u、o、x、X。整型的格式字符前面可以加一个附加格式说明符l或h。l用于长整型输入或输出;h用于短整型的输入或输出。一般地,int型用d,short型用hd,long型用ld。,与整型相关的常用格式字符,格式字符i与格式字符d的作用相同。格式字符u以无符号数编码格式来输入或输出十进制整数。注意:在利用格式符串%u输入数据遇到负数时,仅仅把负数的补码存储到相关内存单元。如:unsigned short i;scanf(%hu,处理方式类似。,函数printf的输出,利用格式符串%u输出时,相关数据会以无符号数编码格式输出,如unsigned short i=-1;printf(%hu,%hu,-1,i);语句的输出为65535,65535。注意:函数printf在输出数据时,只根据其格式字符串解释相关内存单元的编码格式!如:unsigned long l=-1;printf(%d,%hu,l,l);则输出为:,1111 1111 1111 1111 1111 1111 1111 1111,格式字符o,格式字符o以无符号数编码格式八进制整数形式输入或输出数据。格式字符o把用户输入的数据看作八进制整数,因此可以简单地理解为它先把输入数据转换为十进制整数,然后再按无符号数编码格式处理。计算机中只存储整型数据的二进制补码形式。对于语句scanf(%ho%ho,语句的输出为177777,27。,格式字符x和X,格式字符x和X以无符号数编码格式十六进制整数形式输入或输出数据,x和X的区别在于输出时整数中的字母(af)是小写(x时)还是大写(X时)。对于语句scanf(%hx%hx,语句的输出为ffffffff,1B。,例2-8 整型数据的输入和输出,23 23 23(回车),i:23:0000 0000 0001 0111j:023:0000 0000 0001 0011k:0 x23:0000 0000 0010 0011,程序分析,scanf(%hd%ho%hx,例2-8 整型数据的输入和输出,-23-23-23(回车),i:23:0000 0000 0001 0111?j:023:0000 0000 0001 0011?k:0 x23:0000 0000 0010 0011?,i:1111 1111 1110 1001j:1111 1111 1110 1101k:1111 1111 1101 1101,程序分析,scanf(%hd%ho%hx,注意,在用scanf函数输入多个数据时,数据之间默认以空格、制表符(Tab键)或回车分隔,如果格式字符串之间有其它字符,则约定数据之间以该字符为分隔,如格式字符串为%d,%d时,数据的输入形式应为23,23回车。,return,2.4.1 浮点型的取值范围和有效数字,C语言中的浮点型对应于浮点数用于定义存储小数的变量。C语言中将编码长度为4个字节的浮点数称为float型。下面以节中介绍的浮点数为例估算一下float型浮点数的取值范围和有效数字。float型浮点数的阶码占一个字节,取值范围-128127,因此它的取值范围为2-1282127,约为10-381038。float型浮点数的尾数占三个字节,可以精确到二进制小数点后第23位(最高位是符号位),即2-23,约为10-6.9。因此,它的有效数字为十进制小数点后67位。,return,2.4.2 C语言中常用的浮点型有两种:float型和double型,C语言中还有long double(长双精度)浮点型。C语言标准规定long double的精度至少与double相同,VC6.0为一个long double型变量分配8个字节,而在有些系统则分配16个字节。,return,2.4.3 浮点型的字面量,浮点型的字面量有两种格式,小数形式和指数形式。小数形式如0.25,-3.0等,指数形式用e或E分隔尾数和阶码如-1.23e-2,0.023E3等。浮点型的字面量通常被认为是双精度数,有其参与的运算时,结果也是一个双精度数,当需要把运算结果存储在一个单精度的浮点型变量中时,只保存也仅能保存其前7位(十进制的7位,实际上是二进制的23位)。这样做可以使计算结果更精确,但运算速度稍低。当程序对精度要求不高时,可以在字面量的后面加字母f或F强制系统把它们按单精度数处理,如1.23e-2F*2.56789123f的积就是单精度的。,浮点型数据输入,浮点型数据输入时,常用的格式字符有 f、e和E,它们对应于单精度的字面量。前面加一个附加格式说明符l后,它们则对应于双精度的字面量。float f;double d;scanf(“%f%e”,?,浮点型数据输出,浮点型数据可以用两种形式输出:小数形式和指数形式。小数形式输出时的格式字符为f,此时默认输出6位小数。指数形式输出时的格式字符为e或E,两者不同之外在于用小写e还是大写E分隔尾数和阶码。用指数形式输出时,数据为规范的指数形式即尾数的整数部分仅有一位且不是0。在输出浮点型数据时不区分单双精度。,小数形式和指数形式,m.n形式的修饰符,可以在%和格式字符之间插入m.n形式的修饰符(如3.2f)调整输出,m和n应为正整数,m用于限定输出数据所占的最小宽度,即输出最少占m列。输出数据长度小于m,则在左端补空格,n用于指定输出数据的小数位数。如1.23e+002的输出占9列,当m的值为11时,输出为“1.23e+002”;m.n前有减号-时数据会左对齐输出,此时的输出为“1.23e+002”。当数据的实际长度大于m的值时按实际长度输出,因为m仅限定了输出的最小宽度。,m.n形式的修饰符,-m.n形式的修饰符可以部分使用,如%-5f表示输出的最小宽度为5列,实际长度小于5列时左对齐%.3f表示输出的数据保留3位小数。另外-m形式的修饰符可以用于整型数据,作用相同,如%-5d表示输出整数时最小宽度为5列,实际长度小于5列时左对齐。,例2-9 浮点型数据的输入和输出,例2-9 浮点型数据的输入和输出,使用浮点型变量时,需特别注意误差和精度。,return,2.5.1 字符型数据的编码,字符型数据是非数值型数据,包括各种文字、数字与符号等。和数据型数据一样,字符型数据也需要以数字化信息编码的形式存储到计算机中。字符型数据编码时,不仅要考虑编码长度,还要考虑字符如何输入(输入码)、如何存储(机内码)、怎样输出字符的形状(输出码)。简单介绍西文字符的机内码。西文字符通常包括:英文字母、数字、标点符号、运算符号(+,*,/)等。,标准化是字符编码的原则,规定每个字符对应的二进制串,计算机中需要存储一个字符时就存储其对应的二进制串,反之计算机中的这个二进制串如果要解释为字符就输出为该字符。如果都遵照相同的标准,则相互之间就可以准确地传递文字信息了。西文字符的机内码采用ASCII码(ASCII编码表见附录)。ASCII码的码长为一个字节,最高为0,因此ASCII码可以编码128(27)个西文字符,其中大部分为可打印或可显示字符,一些是控制字符。,ASCII码,return,2.5.2 字符型字面量,9是一个整数,还是一个字符呢?字符型字面量用一对单撇号括起来表示,如9,A,b,*,(空格字符)等。字符型变量的类型说明符为关键字char。语句char c=9;定义了一个字符型变量c,并初始化为字符9的ASCII码,即变量c所代表的内存单元的存储状态为有语句short i=9;时,变量i所代表的内存单元的存储状态为,字符型字面量的其它形式,单撇号本身该如何办呢?用char c=;的形式显然不合适。此外,ASCII码中的控制字符在键盘上没有对应键时又该如何输入它们呢?字符型字面量的另一种形式是一对单撇号内直接放字符的ASCII码,此时,字符的ASCII码必须以开头,后跟该字符的八进制形式的ASCII码,或后跟以x或X开头的该字符的十六进制形式的ASCII码。还有一种形式是直接给出字符的ASCII码。,下面几条语句等价,char c=57;char c=071;char c=0 x39;char c=9;char c=71;char c=x39;char c=X39;,表2-2常用的转义序列,字符串,字符串简单地理解为用一对双撇号括起来的一串字符型字面量,如 Hello,c!n等。注意:printf(“Hello,c!n);与printf(”Hello,c!12);等价。同样,下面几条语句等价:char c=10;char c=n;char c=12;char c=xa;,return,例2-10字符型数据的输入和输出,与字符型数据相对应的格式字符为c。,回车键,注意C语言中通常把回车键解释为换行符(n),而非回车符(r),当输出换行符(n)时,正如前面章节中经常用到的那样,不会显示什么字符只是把当前的输出位置移到下一行的开始处。由于变量cd的值为n,因此语句printf(ca)%c(cb)%c(cc)%c(cd)%c,ca,cb,cc,cd);与printf(ca)%c(cb)%c(cc)%c(cd)n,ca,cb,cc);等价。,整型方式输出,字符型数据也可用整型方式输出,printf函数把变量所标示的内存单元的内容以整型编码方式解释。变量ca存储内容为9的ASCII码,以%d格式输出时为57。,putchar函数和getchar函数,putchar函数的功能是向输出设备输出一个字符。使用时,把欲输出的字符数据作为putchar函数的输入即可。例2-11 putchar函数的使用,getchar函数,getchar函数的功能是获得用户输入的一个字符,并把字符的ASCII码作为函数的返回值。例2-12 getchar函数的使用,注意:,程序执行到语句c=getchar();时,getchar函数运行,等待用户输入数据。getchar函数只有遇到回车后才返回,因此即使输入zzj回车,getchar函数也是返回首个字符z,此时程序的输出依然为:z。,例2-13 综合示例,return,