第7章基本类型_第1页
第7章基本类型_第2页
第7章基本类型_第3页
第7章基本类型_第4页
第7章基本类型_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章基本类型1基本类型C语言的基本(内置的)类型:整型(int):long、short和unsigned浮点型:float,double和longdouble字符型(char)布尔型(_Bool(C99))2整数:有符号、无符号有符号数:二进制最高位(最左边)为符号位,0:整数,1:负数最大16位整数:32,767(215–1),二进制表示形式0111111111111111。最大32位整数是01111111111111111111111111111111,数值为2,147,483,647(231–1)。无符号整数:最左边位是数值的一部分最大的16位无符号整数65,535(216–1)。最大的32位无符号整数是4,294,967,295(232–1)。3有符号和无符号整数整型变量默认有符号无符号数:强制声明unsigned类型。无符号数:主要用于系统编程和低级的、与机器相关的应用。4整型int型通常有32位,long位更多,short位更少。有/无符号+三种长度(关键字)产生6种类型组合:shortint unsignedshortintint unsignedintlongint unsignedlongint关键字的顺序没有要求,“int”也可以省略longint可以缩写为long。5整型6种整型的取值范围随机器的不同而不同。

C标准要求:shortint、int和longint中的每一种类型都要覆盖一个确定的最小取值范围。其次,长度:longint>=int>=shortint6整型16位机器上整型通常的取值范围:

类型

最小值最大值short

int(2Byte) –32,768 32,767unsigned

short

int 0 65,535int –32,768

32,767unsigned

int 0

65,535long

int(4byte) –2,147,483,648 2,147,483,647unsigned

long

int 0

4,294,967,2957整型32位机器上整型通常的取值范围:

类型

最小值最大值short

int(2byte) –32,768 32,767unsigned

short

int 0 65,535int(4byte) –2,147,483,648 2,147,483,647unsigned

int 0 4,294,967,295long

int –2,147,483,648 2,147,483,647unsigned

long

int 0

4,294,967,2958整型64位机器上整型通常的取值范围:

类型

最小值最大值 short

int –32,768 32,767 unsigned

short

int 0 65,535 int –2,147,483,648 2,147,483,647 unsigned

int 0 4,294,967,295 long

int –263 263–1 unsigned

long

int 0

264–1上述取值范围并非C标准强制标准库头文件

<limits.h>

可以找到定义了每种整数最大值和最小值的宏。9C99中的整型提供了两种附加的标准整型(至少64位):long

long

int

和unsigned

long

long

int.long

long

int

的取值范围通常是–263(–9,223,372,036,854,775,808)到263–1(9,223,372,036,854,775,807).unsigned

long

long

int的取值范围通常是

0到264–1(18,446,744,073,709,551,615).10整型常量常量是在程序中以文本形式出现的数。变量:温度常量:密度,圆周率,汇率C语言允许用十进制、八进制和十六进形式书写整型常量。本质上?二进制11八进制和十六进制数八进制数:0~7编写。每一位表示一个8次幂。237[八进制]十进制数:

2×82+3×81+7×80=128+24+7=159。十六进制数:0~9加上A~F,A~F分别10~15。1AF[十六进制]十进制:1×162+10×161+15×160=256+160+15=431。12整型常量十进制常量包含数字0~9,以非零数字开头: 1525532767八进制常量包含数字0~7,以零开头: 0170377077777十六进制常量包含数字0~9和字母a~f(大小写均可),以0x开头: 0xf0xff0x7fff0xfF0xFF13不管什么进制,对数本身没有影响,计算机只识二进制。整型常量常量没有声明(大小)十进制常量通常:int类型,超过int范围,用longint,还大,编译器会将其作为unsignedlongint来处理。八或十六进制:编译器将遍历int,unsignedint,longint和unsignedlongint类型,直到找到适合的表示常量的类型。14整型常量常量后加上字母L(或l):强制编译器把常量作为长整型数来处理: 15L0377L0x7fffL常量后边加上字母U(或u),指明无符号常量: 15U0377U0x7fffU常量长且无符号:组合字母L和U: 0xffffffffUL

字母L和U的顺序和大小写都没有关系。15温故而知新基本类型:整型、浮点型、字符、布尔整型三种长度:short、int、long、longlong[C99]符号:有/无整型常量十进制常量包含数字0~9,以非零数字开头:

八进制常量包含数字0~7,以零开头:十六进制常量包含数字0~9和字母a~f(大小写均可),以0x开头:加L(或l),加U(或u)16整型溢出算术运算结果超出表示范围。溢出表现跟操作数有无符号有关有符号溢出,程序的行为是没有定义的(不确定的)。无符号溢出时,掐头取尾结果为正确结果模(余)除2n的结果,n:存储运算结果的位数。17eg.两位十进制相加,结果取两位:56+78=134,取值34读/写整数无符号整数、短和长整型整数需要一些新的转换说明符。无符号整数,使用字母u、o或x。 unsignedintu;

scanf(“%u",&u);//十 printf("%u",u); scanf("%o",&u);//八 printf("%o",u); scanf("%x",&u);//十六 printf("%x",u);18读/写整数短整型:在d、o、u或x前面加上字母h: shorts;

scanf("%hd",&s); printf("%hd",s);长整型:在d、o、u或x前面加上l。长长整型:在d、o、u或x前面加上ll。19程序:数列求和(改进版)数列项或和可能超出int表示范围。在16位int机器上,可能发生: Enterintegers(0toterminate):1000020000300000 Thesumis:-5536将变量改换成longint型进行改进。20intmain(void){

longn,sum=0;

printf("Thisprogramsumsaseriesofintegers.\n");printf("Enterintegers(0toterminate):");

scanf("%ld",&n);while(n!=0){sum+=n;

scanf("%ld",&n);}

printf("Thesumis:%ld\n",sum);

return0;}21intn;longsum=0;浮点型float:单精度浮点数double:双精度浮点数longdouble:扩展双精度浮点数22浮点型float适合精度要求不严格的浮点数。

double为大部分的程序提供了足够的精度。

longdouble很少用到。C标准没有说明三种float具体精度,因为不同计算机存储浮点数的方法可以不同。

大多数现代计算机和工作站都遵循IEEE754标准。23IEEE浮点标准提供了两种主要的浮点数格式:float(32位)和double(64位)。

数值以科学计数法的形势存储:符号、指数和小数。float:符号1位、指数8位(含1位符号),小数部分23位。最大值大约3.40×1038,其中精度是6个十进制数字。(2^23-1)e(2^7-1)实际小数25,指数6位(2^25-1)e(2^5-1)=33554431e3124浮点类型IEEE标准:类型

最小正值

最大值精度 float

1.17549

10–38

3.40282

1038 6digits double

2.22507

10–308

1.79769

10308 15digits不遵循IEEE标准的计算机上,该表无效。在一些机器上,float可以有和double相同的数值集合,或double可以有和long

double相同的数值。

25浮点类型可以在<float.h>中找到定义浮点型特征的宏。C99提供:实浮点型复浮点型:float_Complex、double_Complex、longdouble_Complex26浮点常量——多种书写方式如果有指数(10的幂),必须在指数前放置字母E(或e)。符号(+或-)可以出现在字母E(或e)的后边。57.0的有效写法如下:57.057.57.0e057E05.7e15.7e+1.57e2570.e-127浮点常量默认情况下,以双精度数的形式存储。只需单精度,常量末尾加F(或f)(如57.0F)。以longdouble格式存储,常量末尾加L(或l)(如57.0L)。28读/写浮点数单精度浮点数:用转换说明符%e、%f和%g。doublefloat,在e、f或g前放置字母l: doubled;

scanf("%lf",&d);

注意:只能在scanf函数格式串中使用l,不能在printf函数格式串中使用,e、f和g可用来格式输出float或double型值。C99可加l,但不起作用l控制scanf读缓存longdouble,在e、f或g前放置字母L。scanf("%Lf",&d);printf("%Lf",d);29温故而知新基本类型:整型、浮点型、字符、布尔整型三种长度:short、int、long、longlong[C99]符号:有/无读写:%[h/l]d/u/o/x浮点float、double、longdouble读写:%[l/L]e/f/g字符本质上是整数(编码为8位二进制),ASCII30字符型char字符如何显示?printf(’A’);12*8点阵计算机用数字对字符编码——学号值可以根据计算机的不同而不同,因为不同的机器可能会有不同的字符集。例如,考试座位号31字符集最常用的字符集是ASCII(美国信息交换标准码),它用7位代码表示128个字符。0-9:0110000-0111001数字,数vs字,eg,9和’9’A-Z:1000001-1011010ASCII常被扩展为8位代码用于表示256个字符代码,被称为Latin-1,提供一些西欧和许多非洲语言所需的字符。32字符

ASCII表ASCII值控制字符ASCII值控制字符ASCII值控制字符ASCII值控制字符0NUT32(space)64@96、1SOH33!65A97a2STX34”66B98b3ETX35#67C99c4EOT36$68D100d5ENQ37%69E101e6ACK38&70F102f7BEL39,71G103g8BS40(72H104h9HT41)73I105i10LF42*74J106j11VT43+75K107k12FF44,76L108l13CR45-77M109m14SO46.78N110n15SI47/79O111o16DLE48080P112p17DCI49181Q113q18DC250282R114r19DC351383X115s20DC452484T116t21NAK53585U117u22SYN54686V118v23TB55787W119w24CAN56888X120x25EM57989Y121y26SUB58:90Z122z27ESC59;91[123{28FS60<92/124|29GS61=93]125}30RS62>94^126~31US63?95—127DEL33

字符集char型变量可赋值为任何单个字符: charch;

ch='a';/*lower-casea*/ ch='A';/*upper-caseA*/ ch='0';/*zero*/ ch='';/*space*/注意,字符常量需要用单引号括起来,而不是双引号。34字符操作C语言按小整数的方式处理字符。内存视角(本质),1字节的二进制序列(ASCII码)printf(“%d”,ch);ASCII码:0000000~1111111(0~127)

‘a’为97,‘A‘为65,’0’为48,‘’为32。35字符操作以ASCII码存贮字符:36charc1,c2;c1=97,c2=98;printf("%c,%c\n",c1,c2);printf("%d,%d\n",c1,c2);}运行结果:a,b97,9801100001%c%da97显示97字符操作字符常量实际上是int类型,而不是char类型。charch=‘a’;——ch=97;#defineCH‘A’——defineCH65370000009797不用管,实际值相同字符本质int数值可以比较、算术运算计算,使用它对应的整数值。38字符操作——赋值运算eg.假设采用ASCII码字符集: charch; inti;

i='a';/*iisnow97*/ch=65;/*chisnow'A'*/ch=ch+1;/*chisnow'B'*/ch++;/*chisnow'C'*/39实现在字符间游走:ch++大小写转换:‘A’(65)-》’a’(97),间隔32‘A’+32=‘a’32=‘a’-’A’转换因子字符操作——比较测试ch是否是小写字母;是则转化对应大写。 if('a'<=ch&&ch<='z') ch=ch-'a'+'A';//'A'-'a‘=65-97=-32具体数值随字符集而有所不同,程序使用<,<=,>,和

>=

来进行字符比较可能不易移植。40字符操作字符数的属性之好处:eg.for循环控制:for(ch='A';ch<='Z';ch++)…字符数的属性之缺点:可能会导致编译器无法检查出来的错误。导致编写出诸如‘a’*‘b’/‘c’的无意义的表达式。

可能会妨碍程序的可移植性Eg,上述for语句利用A到Z连续编码41有符号和无符号字符存在有符号和无符号两种char类型。 signedcharsch; unsignedcharuch;有符号字符:–128~127,无符号型字符:0~255。一些编译器按有符号处理,一些编译器按无符号。大多数时候,没有太大关系,不用关心。42算术类型整数类型charint枚举(有序集合):学校专业浮点类型实数复数43转义序列字符:普通字符:0-9,a-z,A-Z等,常量书写:单引号括起来特殊字符:不可见、(无法打印的或键入),如换行、制表符,需特殊表示法\n,\t转义序列呈现这类特殊符号字符转义序列数字转义序列44字符转义序列

名称

转义序列 Alert(bell) \a Backspace \b Formfeed \f Newline \n Carriagereturn \r Horizontaltab \t Verticaltab \v

Backslash \\

Questionmark \? Singlequote \' Doublequote \"方便但表示范围有限(仅常用特殊字符)不包含所有无法打印的ASCII字符,如ESC无法表示ASCII字符以外的字符,西欧、非洲等8位(256)Latin-1用编号表示45数字转义序列可以表示任何字符。

格式:\??????:字符的八进制或十六进制编码(非十进制)八进制:如\33或\033。最多三位八进制数十六进制:如\x1b或\x1B。最多两位十六进制数,x小写,十六进制数字不限大小写。作为字符常量:单引号括起来。’\141’0141=97数字转义序列隐晦,#define命名意义明确: #defineESC'\33'转义序列可嵌入字符串中使用。“hello\n”46字符处理函数toupper库函数:小写字母转换成大写字母,tolower反之:ch=toupper(ch);//ch-’a’+’A’toupper在ctype.h中声明#include<ctype.h>C函数库提供了其他有用的字符处理函数。47读/写字符scanf和printf用转换说明符%c对单个字符读/写:%c读字符不会跳过空白、回车等字符,读所有字符。扫描行结束符(检查读入字符是否为换行符)。do{ scanf(“%c”,&ch);}while(ch!=‘\n');//do循环循环结束后ch=?ch读入行所有字符,只保留?如需跳过空白等字符,%c前面加空格:scanf("%c",&ch);48读/写字符gechar()和putchar()代替scanf函数和printf函数读取字符。格式:putchar(ch);//printf(“%c”,ch)ch=getchar();//scanf(“%c”,&ch)gechar()和putchar()节约时间实现简单作为宏实现#define

getchar()getc(stdin)49读/写字符gechar还优于scanf()函数——返回字符ch=getchar();scanf(“%c”,&ch)用getchar()扫描行结束(末尾’\n’):do{ ch=getchar();}while(ch!='\n');精简循环控制表达式调用gechar函数:while((ch=getchar())!='\n');50读/写字符循环转换为do{;}while((ch=getchar())!='\n');进一步转换为while((ch=getchar())!='\n');getchar()至少执行一次甚至变量ch都可以不需要:while(getchar()!='\n');类似等式代入51while(getchar()!='\n')len++;统计行字符数读/写字符用getchar跳过若干空格,遇到第一个非空字符循环终止。while((ch=getchar())=='');while(getchar()=='');52混用getchar和scanf要小心例如,计算标准体重程序,性别“回车” printf("Enteraninteger:"); scanf("%d",&i); printf("Enteracommand:"); command=getchar();scanf爱剩饭输入串不匹配格式串,退回缓冲区getchar不挑食读入缓冲区任意字符53程序:确定用户输入消息的长度Enteramessage:Brevityisthesoulofwit.Yourmessagewas27character(s)long.长度包括空格和标点符号,不含结尾换行符。可采用scanf或getchar函数读取字符,大多数C程序员愿意采用getchar函数。54#include<stdio.h>

intmain(void){charch;intlen=0;

printf("Enteramessage:");

ch=getchar();while(ch!='\n'){len++;ch=getchar();}printf("Yourmessagewas%dcharacter(s)long.\n",len);

return0;}55while(getchar()!='\n') len++;类型转换计算机执行算术运算,通常要求操作数具有相同的位数和存储方式。不同类型操作数进行计算,C编译器要先类型转换,方便硬件实现。a(16位int)+b(32位longint),a先转化成32位longintint与float运算,将int转换为float。56类型转换类型隐式转换:编译器自动处理的转换,无需程序员介入。显示转换:程序员使用强制运算符。57隐式类型转换基本数据类型种类多,规则略微复杂算术转换:算术或逻辑表达式中操作数的类型不同时赋值转换:赋值运算符右侧表达式和左侧变量的类型不匹配时。函数调用转换:函数调用中使用的参数类型与对应参数类型不匹配时。函数返回转换:return语句中表达式的类型和函数返回值的类型不匹配时。58常用算术转换多用于二元运算,eg.floatx;inti;x+i;i——》float比x——》int更安全。int——》float,几乎没什么损失。float——》int,损失小数部分;更糟糕的是,如果(x超出int表示范围),将得到没有意义的结果。59常用算术转换策略统一操作数类型:类型提升——将相对较狭小类型的操作数转换成另一个操作数的类型。整型提升:shortint——》int。60类型提升规则(跟大碗)61高float

doublelongdoubleunsignedlong

longunsigned低intchar、short最好尽量避免使用无符号整数,特别是不要把它和有符号整数混合使用。常用算术转换示例 charc; shortints; inti; unsignedintu; longintl; unsignedlongintul; floatf; doubled; longdoubleld;

i=i+c; /*c——》int*/ i=i+s; /*s——》int*/ u=u+i; /*i——》unsignedint*/ l=l+u; /*u——》longint*/ ul=ul+l; /*l——》unsignedlongint*/ f=f+ul; /*ul——》float*/ d=d+f; /*f——》double*/ ld=ld+d; /*d——》longdouble*/62赋值类型转换(削足适履)v=expr:expr——》左值v的类型 charc; inti; floatf; doubled;

i=c;/*c——》int*/ f=i;/*i——》float*/ d=f;/*f——》double*/63怎么削足浮点数赋值给整型变量,削小数部分。 inti;

i=842.97; /*iisnow842*/ i=842.97; /*iisnow-842*/expr结果超出左值取值范围,掐头取尾: charc; c=256+78;(0000

0001

0100

1110) c=10000;/***WRONG***/ i=1.0e20;/***WRONG***/ f=1.0e100;/***WRONG***/64温故而知新 ——字符二进制编码,ASCII码实质上小整数操作:printf(),%d,%c赋值字符-》整型;整型-》字符比较大小写转换:ch=ch+‘a’-‘A’;for(ch='A';ch<='Z';ch++)…算术ch++;‘a’*‘b’/‘c’65温故而知新 ——转义序列字符转义序列仅常用特殊字符,\n,\t方便但表示范围有限()数字转义序列\??????:字符的八进制或十六进制编码(非十进制)66温故而知新 ——字符处理函数输入scanf,getchar,getc,输出printf,putchar,putc;大小写转换toupper(ch),tolower(ch);<ctype.h>67温故而知新——处理文本扫描行结束(末尾’\n’):do{ ch=getchar();}while(ch!='\n');精简while(getchar()!='\n');确定消息长度:while(getchar()!='\n') len++;68温故而知新——类型转换需求:操作数类型不同运算要求操作数具有相同位数和存储方式隐式,编译器自动算术赋值函数调用函数返回显示(强制),程序员使用强制运算符()69常用算术转换策略统一操作数类型:类型提升——将相对较狭小类型的操作数转换成另一个操作数的类型。整型提升:shortint——》int。70类型提升规则(跟大碗)71最好尽量避免使用无符号整数,特别是不要把它和有符号整数混合使用。高float

doublelongdoubleunsignedlong

longunsigned低intchar、short强制类型转换隐式转换自动完成,更大程度控制类型转换需主动进行转换。

强制类型转换表达式格式如下: (类型名)表达式

72强制类型转换求float型值小数部分:floatf,frac_part;

frac_part=f-(int)f;求均值floataverage;intsum,n;average=(float)sum/n;73强制类型转换优先级一元运算符,优先级高于二元运算符: (float)sum/n

解释为 ((float)sum)/n其他方法可以实现同样的效果: average=sum/(float)n;

average=(float)sum/(float)n;强制转任一操作数,其余隐式转换74强制类型转换使用强制类型转换来避免溢出: longi; intj=1000;

i=j*j;/*ov

温馨提示

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

评论

0/150

提交评论