资源预览内容
第1页 / 共33页
第2页 / 共33页
第3页 / 共33页
第4页 / 共33页
第5页 / 共33页
第6页 / 共33页
第7页 / 共33页
第8页 / 共33页
第9页 / 共33页
第10页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第三章 基本数据类型与数据运算,C语言支持的数据类型及类型名称和机器内表示 各类型常量的表示、变量的定义及变量的访问 类型转换与格式化输出 C语言运算符和表达式,5U 5 -12 -12L 3.14 5.0 a “abc” ”a” C语言支持哪些数据类型?如何定义?如何存储?各类型的常量和变量如何表示?,3.2 数据类型,C中没有bool型(逻辑型),进行逻辑运算时零代表假,非零代表真,整型:,无符号数直接转换为二进制存储,高端补0;有符号数存储补码,实型:参照IEEE754标准,字符型与字符串常量:,字符型常量是用单引号括起来的单个字符,如char c=a,a=a 字符型变量的内存单元中实际存放字符的ASCII码,如上例存97 由于字符型数据实际对应一整数,故字符型与整型有时可通用: int i=a; char c=97; int j=a-32; char b=c-32; 数值范围的理解:有符号字符型-128到127,无符号0-255,3.3 常量与变量,常量:程序运行过程中不可变的量,整型 5 -12 010 -010 0x2 -0x2F 50U -123L 实型 3.14 12. .5 12.3e3 -1E4 2.3f 字符型a A 2 $ n 101 x2A 字符串 “study hard!” “a”,整型默认为signed int型,后加U或L可改变类型;有十/八/十六进制三种写法 实型默认为double型,后可加f指定为float型,分小数形式和指数形式两种; 指数形式表示时E或e前不能空,e后为整数 字符型常量默认为signed char;分普通字符和转义字符两种.具体看书自学 字符串常量是”括起来的串,末位自动添加结束符0,务必区分A与”A” 注意:-32768U与-32768在寄存器中存储结构一样,均为FF FF 80 00。区别在于,设有Unsigned x;则x=-32768会有警告,而x=-32768U无警告,3.3 常量与变量,符号常量:用标识符代替一个常量(给常量起名),#define PI 3.14 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define NULL 0,#include #define PRICE 30 void main ( ) int num, total; num=10; total=num * PRICE; printf(total=%dn,total); ,使用目的:见名知意,一改全改 标识符命名规则:由字母、数字和下划线组成,以字母和下划线开头,不能与系统保留字(3.1)重名。通常不多于8个字符。不仅符号常量名,变量名和函数名亦遵循此规则 规范:符号常量名通常全部大写,变量名和函数名首字母小写,若由多个单词组成则剩余单词首字母大写。 注:符号常量在编译阶段直接被替换为所代表的常数,不为其分配内存,不能赋值。符号常量定义语句后无分号,3.3 常量与变量,变量:程序运行中值可变的量。,注:变量实际对应内存中一个内存块,块大小由变量类型决定,根据变量名可找到对应的内存块 注:为变量赋值就是根据变量名找到相应内存块,之后将数据(位于累加器)写入其中;取变量的值就是通过变量名找到相应的内存块,从中读取数据到CPU 命名规范:遵循标识符命名规则,最好见名知义 注:必须先定义后使用; 一次可定义多个同类型的变量;使用前通常赋初值,可定义同时赋值(如int i=0),short flag; int i,j,k; long factorial; unsigned count;,float x,y; double average;,char c; unsigned char a;,作业说明:,求最大最小值 辗转相除 级数求和 素数+Fibnacci数列+回文+水仙花数?,回顾:,掌握各种常见语法错/连接错/运行错和逻辑错及其原因 通过编译信息能发现和改正语法错,理解测试的重要性,能合理组织测试数据并通过测试完善程序 了解断点的概念和作用 了解C语言支持的数据类型,掌握整型、实型和字符型数据的分类及各自的类型名称,熟练掌握各自的存储表示 掌握各类型常量的写法与默认类型 符号常量的定义和使用 变量的定义,变量的赋值和使用,整型默认为signed int型,后加U或L可改变类型;有十/八/十六进制三种写法 实型默认为double型,后可加f指定为float型,分小数形式和指数形式两种; 指数形式表示时E或e前不能空,e后为整数 字符型常量默认为signed char;分普通字符和转义字符两种,如101 x2A 字符串常量是”括起来的串,末位自动添加结束符0,务必区分A与”A”,3.4 基本数据类型的转换,自动类型转换:某些类型的数据一旦参与运算(即进入CPU寄存器时),或者不同类型的数据进行混合运算时,数据类型就会发生自动转换,称之为自动类型转换 转换规则:范围小到大,等值转换(不同编译器规则不尽同,VC如下) unsigned char/short进CPU自动转为unsigned int;【高位补零】 signed char与short进CPU时自动转换为等值int;【符号位扩展】 float进CPU直接转为double;【指数部分与尾数部分分别扩充】 无论哪种整型与double型混合运算,整型均转为等值double型 其余:类型长短不一时,以较长的为准,长度相同时,有符号的转化为无符号的,如32767+1L结果32768L;再如a = -1L; b =1U;则ab 例:234-b+26.5,3.4 基本数据类型的转换,强制类型转换:通过类型转换语句显式进行转换 (目标类型)(变量或表达式),注:对变量进行强制类型转换时只是在CPU寄存器中对变量值作临时转换,变量类型及其在内存中的数据保持不变,如以下语句执行后x仍为float型,值仍然为3.5:float x=3.5; int i=(float)x; 注:假设float x=3.5,y=3.5;则(int)x+y为实数值6.5;而(int)(x+y)值为7,#include void main() printf(“%dn“,(int)3.5); printf(“%dn“,(int)-3.5); printf(“%lfn“,(double)3); printf(“%lfn“,(double)-3); printf(“%lfn”,5/3);/不匹配,结果错 printf(“%lfn“,(double)5/3); /注:printf(“%lfn”,1)输出0.000000, double型值=float变量:指数部分与尾数部分分别截取,转换成十进制相当于截取其前7位有效数字 double值=整型变量: 舍弃小数部分,存整数部分 整型数据=实型变量:以等值的浮点数形式存储 各类整型、字符型之间:先将右侧值读入寄存器(遵循前述自动类型转换规则,VC下内存位数不足4字节者均扩展成4字节,有符号数按符号位扩展,无符号数作零扩展。TC下字符型扩充成2字节),之后截取相应数目的字节放入左侧变量空间,补充:不同类型数据间的相互赋值,char c1, c2; /以下是VC下过程分析,TC下将下划线部分去掉 c1=300; /R(300)=0x00 00 01 2C;M(c1)=0x2C c2=400; /R(400)=0x00 00 01 90;M(c2)=0x90 printf(“%c %cn”, c1,c2); /R(c1)=00 00 00 2c, /R(c2)=ff ff ff 90;截取末字节,VC输出, ?;TC输出, printf(“%d %dn”,c1, c2); / R(c1)=00 00 00 2c, /R(c2)=ff ff ff 90;分别是44和-112补码,输出44与-112,补充:格式化输出函数printf说明,正常情况:格式控制符%d用于输入输出有符号整型数,%u用于无符号整型数, %X或%O以十六或八进制输出各类整型;%f用于float,%lf用于double, %c用于char 原理说明:输出值先进入寄存器(可能要扩充),以c输出则截取寄存器最末一字节输出其对应的字符;以d输出意味着将寄存器中的数据当作signed int的补码,输出此补码对应的真值;以u输出意味着将寄存器中的数据当作一个unsigned int,直接转换为十进制数后输出;以X输出则将寄存器中的二进制数从低到高四位合一位输出,高位零省略;以O则三位合一位输出,short a;unsigned short c;short e;/以下VC下分析,TC去下划线 a=100; /*R(100)=0x00 00 00 64; M(a)=0x00 64*/ e=50000; /*R(50000)=0x00 00 C3 50; M(e)=0xC3 50*/ c=a=e; /*R(e)=0x ff ff C3 50;M(a)=0xC3 50*/ /*R(a)=0xFF FF C3 50;M(c)=0xC3 50*/ printf(“%dn”,a); /*R(a)= 0xFF FF C3 50;输出-15536*/ printf(“%u n”,c); /*输出50000*/ printf(“%xn”,a);/R(a)=0xFFFFC350,VC:ffffc350,TC:C350 printf(“%o n”,c); /*R(c)=0x00 00 C3 50; 输出141520*/,作业1:分析如下程序的执行过程与输出结果(似前例,参考作业说明),#include void main() short a,b; unsigned short c,d; long e,f; a=100; /*R(100)=(00 00 00 64)16,截取得M(a)=(00 64)16*/ b=-100; e=50000; f=32767; c=a; d=b; printf(“%d,%dn”,a,b); /* R(a)= (00 00 00 64)16,是100的补码;R(b)= /(ff ff ff 9C)16,是-100的补码,输出100,-100*/ printf(“%u,%un”,a,b); printf(“%u,%un”,c,d); c=a=e; d=b=f; printf(“%d %dn”,a,b); printf(“%u %un”,c,d); printf(“%x %Xn”,a,b); printf(“%o%on”,c,d); ,3.5 运算符和表达式,表达式:运算符和运算对象按一定规则结合在一起形成的式子 记:表达式具有值(运算结果)和类型,如3*5值为15,类型为int,3.5.2算术运算符和算术表达式,算术运算符: + - * / %(双目) + - -(单目) 除运算符/:分子分母均整型时是整除. 取余运算符%:操作数均整型方可,否则编译错.分子分母有负数时,先求绝对值之商,后根据分子定符号:15%4为3; 15%(-4)为3;(-15)%4为-3;(-15)%(-4)为-3 自增运算符+: 变量自增运算符,操作对象必须为变量,如x+或+x,但(x+y)+错。x+是先用后增,先将变量的值读入寄存器参与运算,当前语句结束后再将内存中x的值增1;+x先增后用,先将内存中变量值增1后进入运算器参
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号