C语言从入门到精通第3章_第1页
C语言从入门到精通第3章_第2页
C语言从入门到精通第3章_第3页
C语言从入门到精通第3章_第4页
C语言从入门到精通第3章_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

1、第3章 数据的种类数据类型 p 计算机如何识数数制 p 整型 p 字符型 p 浮点型 p 类型转换 p 综合应用类型转换 p 跟我上机 第3章 数据的种类数据类型 计算机如何识数数制 p 整型 p 字符型 p 浮点型 p 类型转换 p 综合应用类型转换 p 跟我上机 第3章 数据的种类数据类型 计算机如何识数数制 整型 p 字符型 p 浮点型 p 类型转换 p 综合应用类型转换 p 跟我上机 第3章 数据的种类数据类型 计算机如何识数数制 整型 字符型 p 浮点型 p 类型转换 p 综合应用类型转换 p 跟我上机 第3章 数据的种类数据类型 计算机如何识数数制 整型 字符型 浮点型 p 类型转

2、换 p 综合应用类型转换 p 跟我上机 第3章 数据的种类数据类型 计算机如何识数数制 整型 字符型 浮点型 类型转换 p 综合应用类型转换 p 跟我上机 第3章 数据的种类数据类型 计算机如何识数数制 整型 字符型 浮点型 类型转换 综合应用类型转换 p 跟我上机 第3章 数据的种类数据类型 计算机如何识数数制 整型 字符型 浮点型 类型转换 综合应用类型转换 跟我上机 3.1 计算机如何识数数制 3.1.1 二进制 3.1.2 八进制 3.1.3 十六进制 3.1.4 数制间的转换 3.1 计算机如何识数数制 数据在计算机里是以二进制形式的数表示的, 在实际程序中,许多系统程序需要直接对二

3、 进制位的数据操作,还有不少硬件设备与计 算机通信都是通过一组二进制数控制和反映 硬件的状态。在表示一个数时,二进制形式 位数多,八进制和十六进制比二进制书写方 便些,他们都是计算机中计算常用的数制。 3.1.1 二进制 二进制是逢二进一的数制,目前的计算机全 部都是采用二进制系统。0和1是二进制数字 符号,运算规则简单,操作方便,因为每一 位数都可以用任何具有两个稳定状态的元件 表示,所以二进制易于用电子方式实现。 3.1.1 二进制 1. 二进制运算规则 加法:000,011,101,1110 减法:000,101,110,1011 乘法:000,010,100,111 除法:010,11

4、1 例如,((1100))2 + ((0111))2计算如下: 1100 + 0111 10011 3.1.1 二进制 2. 二进制转换为十进制 十进制是逢十进一,由数字符号0,1,2,3,4,5,6,7,8,9组成, 可以这样分析十进制数: (1234)10 = 1 * 103 + 2 * 102 + 3 * 101 + 4 * 100 = 1000 + 200 +30 + 4 =(1234)10 采用同样的方式转换二进制到十进制。 (1101)2 = 1 * 23 + 1 * 22 + 0 * 21 + 1 * 20 = 8 + 4 + 0 + 1 = (13)10 (10.01)2 =

5、1 * 21 + 0 * 20 + 0 * 2-1 + 1 * 2-2 = 2 + 0 + 0 + 0.25 = (2.25)10 3.1.1 二进制 3. 十进制转换二进制 十进制整数转换为二进制:方法是除以2取余,逆序排列,以 (89)10为例,如下。 89 2 余1 44 2 余0 22 2 余0 11 2 余1 5 2 余1 2 2 余0 1余1 (89)10 = (1011001)2 (5)10 = (101)2 (2)10 = (10)2 3.1.1 二进制 十进制小数的转换为二进制:方法是乘以2取整, 顺序排列,以(0.625)10为例,如下。 0.625 * 2 = 1.25取

6、整1 0.25 * 2 = 0.5取整0 0.5 * 2 = 1取整1 (0.625)10 = (0.101)2 (0.25)10 = (0.01)2 (0.5)10 = (0.1)2 3.1.2 八进制 八进制是逢八进一的数制,采用07八个数字组成。八进制比 二进制书写方便,也常用于计算机计算。需要注意的是,C语 言中,八进制数以数字0开头,比如04,017等等。 1. 八进制转换为十进制 和二进制转换为十进制的原理相同,如:(64)8 = 6 * 81 + 4 * 80 = 48 + 4 =(52)10 2. 二进制转换为八进制 整数部份从最低有效位开始,以3位二进制数一组,最高有 效位不

7、足3位时以0补齐,每一组均可转换成一个八进制的值, 转换结果就是八进制的整数。小数部份从最高有效位开始,以 3位一组,最低有效位不足3位时以0补齐,每一组均可转换成 一个八进制的值,转换结果就是八进制的小数。例如: (11001111.01111)2 = (011 001 111.011 110)2 = (317.36)8 3.1.3 十六进制 十六进制就是逢十六进一的数制,采用09和AF十六个数字 组成(A代表10,F代表15),也常用于计算机计算。C语言中, 十六进制数以数字0 x开头,比如0 x1A,0 xFF等。 1. 十六进制转换为十进制 和二进制转换为十进制的原理相同,如: (2F

8、A)16 = 2 * 162 + F * 161 + A * 160= 512 + 240 + 10 =(762)10 2. 二进制转换为十六进制 与二进制转换为八进制相似,只是转换为十六进制时,以4位二进 制数为一组,每一组转换为一个十六进制的值。例如: (11001111.01111)2 = (1100 1111.0111 1000)2 = (CF.78)16 3.1.4 数制间的转换 前面已经接触过标准 输出函数printf()了, 这里就使用printf()函 数输出转换的结果。 printf()函数的格式控 制参数如下表所示。 格式控制参数格式控制参数描述描述 %d十进制有符号整数

9、%u十进制无符号整数 %f十进制浮点数 %o八进制数 %x十六进制数 3.1.4 数制间的转换 【范例范例3-1】 分别使用十进制、八进制和十六进制输出已知数值。分别使用十进制、八进制和十六进制输出已知数值。 01 #include 02 int main(void) 03 04 unsigned int x=12; 05 unsigned int y=012;/*八进制0开头*/ 06 unsigned int z=0 x12;/*十六进制0 x开头*/ 07 printf(十进制%u转化为 八进制%o 十六进制%xn,x,x,x); /*%u表示无符号十进制数*/ 08 printf(八进

10、制%o转化为 十进制%u 十六进制%xn,y,y,y); /*%o表示无符号八进制数*/ 09 printf(十六进制%x转化为 八进制%o 十进制%un,z,z,z); /*%x表示无符号十六进制数*/ 10 return 0; 11 3.2 整型 整型数据,英文单词是Integer,比如0,- 12,255,1,32767等等这些都是整型数 据。整型数据中是不允许出现小数点和其它 特殊符号的。 整型数据共分为七类,分别是字符型、短整 型、整型、长整型、无符号短整型、无符号 整型和无符号长整型。其中短整型、整型和 长整型是有符号数据类型。 3.2 整型 整型整型 字符型字符型 char 短整

11、型短整型 short int 整型整型 int 长整型长整型 long int 无符号无符号 短整型短整型 unsigned short 无符号无符号 整型整型 unsigned int 无符号无符号 短整型短整型 unsigned long 3.2 整型 1. 取值范围 类型类型说明说明字节字节范围范围 整型int4-21474836482147483647 短整型short (int)2-3276832767 长整型long (int)4-21474836482147483647 无符号整型unsigned (int)404294967295 无符号短整型unsigned short (i

12、nt)2065535 无符号长整型unsigned long (int)404294967295 字符型char10255 3.2 整型 2. 有符号数和无符号数 对于有符号数,以最高位(左边第一位)作为符号位, 最高位是0表示的数据是正数,最高位是1表示的 数据是负数。 整数10二进制形式:00001010 整数-10二进制形式: 10001010 3.2 整型 对于无符号整数,因为表述的都是非负数,一个 字节中的8位全部用来存储数据,不再设置符号位。 整数10二进制形式:00001010 整数138二进制形式: 10001010 3.2 整型 3. 类型间转换 不同类型的整型数据所占的字节

13、数不同,他们在相互转换时需要 格外留心,不要把过大的数据放在过小的数据类型中,在把占字节较 大的数据赋值给占字节较小的数据时,防止出现以下的情况。 例如 int a = 2147483648; printf(%d,a); 这样赋值后,输出变量a的值并非预期的2147483648,而是- 2147483648,原因是2147483648超出了int类型能够装载最大值, 数据产生了溢出。如果换一种输出格式控制符,代码如下所示: printf(%u,a); 输出的结果就是变量a的值,原因是%u是按照无符号整型输出的 数据,而无符号整型的数据范围上限大于2147483648这个值。 3.2 整型 un

14、signed short a = 256; char b = a; printf(%d,b); 这样赋值后,输出变量b的值并非预期的256, 而是0,原因是256超出了char类型能够装载最大 值,b只截取了a的低8位的数据,如下: 变量a 0000000100000000 变量b 高8位被截掉了! 00000000 3.2 整型 当把占字节较小的数据赋值给占字节较大的数据时,可能出现以下两种情 况。 第1种情况,当字节较大数是无符号数时,转换时新扩充的位被填充成0 char b = 10; unsigned short a = b; printf(%u,a); 这样赋值后,变量a中输出的值是

15、10,原因如下: 变量b 空的 00001010 变量a 0000000000001010 3.2 整型 第2种情况,当字节较大数是有符号数时,转换时新扩充的位被填充成符号位 char b = 255; short a = b; printf(%d,a); 这样赋值后,变量a输出的值是-1,变量a扩充的高8位,根据变量b的最 高位1都被填充成了1,所以数值由正数变成了负数,因为变量a的最高位符号 位是1,至于为什么16个1表示的是-1,涉及到二进制数的原码和补码问题, 这里先不深究。转换图示如下: 变量b 空的11111111 变量a 1111111111111111 3.3 字符型 字符型是

16、整型数据中的一种,它存储的是单个的字 符,存储方式是按照ASCII码(American Standard Code for Information Interchange, 美国信息交换标准码)的编码方式,每个字符占一 个字节,8位(ASCII码可查阅王牌2中的相关内容)。 使用单引号“”把字符引起来,用以和变量、其 他数据类型区别。比 如:A,5,m,$,;等等。 3.3 字符型 比如有这样5个字符:H、e、l、l、o,他们 在内存中存储的形式如下的图表所示。 0100100001100101011011000110110001101111 Hello 3.3 字符型 字符型的输出,既可以使

17、用字符的形式输出 字符,即采用“%c”格式控制符,还可以使 用上小一节采用的其他整数输出方式。比如: char c = A; printf(“%c,%u”,c,c); 输出结果是:A,65 此处65是字符A的ASCII码。 3.3 字符型 【范例3-2】 字符和整数的相互转换输出 01 #include 02 int main(void) 03 04 char c=a; /*字符变量c初始化*/ 05 unsigned i=97; /*无符号变量i初始化*/ 06 printf(%c,%un,c,c); /*以字符和整形输出c*/ 07 printf(%c,%un,i,i); /*以字符和整形

18、输出c*/ 08 return 0; 09 3.3 字符型 字符的家族中,控制符是无法通过正常的字 符形式表示,比如常用的回车、换行、退格 等等,需要使用特殊的字符形式来表示他们, 这种特殊字符称为转义符。 3.3 字符型 转义符转义符说明说明ACSII码码 n换行,移动到下一行首00001010 t水平制表键,移动到下一个制表符位置00001001 b退格,向前退一格00001000 r回车,移动到当前行行首00001101 a报警00000111 ?输出问号00111111 输出单引号00100111 ”输出双引号00100010 ooo八进制方式输出字符,o表示八进制数空 xhhh十六进

19、制方式输出字符,h表示十六进制数空 0空字符000000 3.3 字符型 【范例范例3-3】 输出字符串,分析转义符的作用。输出字符串,分析转义符的作用。 01 #include 02 int main(void) 03 04 printf(12345678901234567890n); /*参考数据*/ 05 printf(abctdefn); /*转移符使用*/ 06 printf(abctdebfn); 07 printf(abctdebrfn); 08 printf(abcdefghi?n); 09 printf(整数98n); /*转移符数制*/ 10 printf(八进制表达整数9

20、8是 142n); 11 printf(十六进制表达整数98是x62n); 12 return 0; 13 3.4 浮点型 C语言中除了整型外,另外一种数据类型就 是浮点型,浮点型可以表示有小数部分的数 据。浮点型包含三种数据类型,分别是单精 度的float类型,双精度的double类型,和 长双精度long double类型。 3.4 浮点型 浮点型 floatdoublelong double 类型类型位数位数有效数字有效数字取值范围取值范围 float3267-1.4e-453.4e38 double641516-4.9e-3241.8e308 long double1281819 3.

21、4 浮点型 参与运算的表达式中存在double类型,或者说,参与运算的表达式不是 完全由整型组成的,在没有明确的类型转换标识的情况下(将在下一小节 中讲解),表达式的数据类型就是double类型。例如: 1 + 1.5 + 1.23456789/*表达式运算结果是double类型*/ 1 + 1.5/*表达式运算结果是double类型*/ 1 + 2.0/*表达式运算结果是double类型*/ 1 + 2/*表达式运算结果是int类型*/ 例子当的1.5,编译器默认它为双精度的double类型,精度高占据存储空 间大,如果只希望以单精度float类型运行,可以在常量后添加字符f或 者F都可以,

22、比如1.5F,2.38F。同样的,如果希望数据是以精度更高 的long double参与运算,可以在常量后添加字符l或者L都可以,比 如1.51245L,2.38000L。建议使用大写L,因为小写l容易和数字 1混淆。 3.4 浮点型 再举几个运算的表达式的例子,如下所示: int i,j; float m; double x; i + j/*表达式运算结果是int类型*/ i + m /*表达式运算结果是float类型*/ i + m +x /*表达式运算结果是double类型*/ 3.4 浮点型 指数形式如下所示(e或者E都可以) 2.0e3表示2000.0 1.23e-2表示0.0123

23、 .123e2表示12.3 1e-3表示0.001 对于指数形式,有以下两点要求: 字母e前面必须要有数字 字母e的后面必须是整数 浮点型 小数形式指数形式 3.5 类型转换 3.5.1 隐式转换 3.5.2 显式转换 3.5 类型转换 计算过程中,如果遇到不同的数据类型参与 运算该怎么办,是终止程序还是转换类型后 继续运算。编译器采取第二种方式,如果能 够转换成功,程序继续运算,如果转换失败, 程序报错同时终止运行。数据类型有两种转 换方式,分别隐式转换和显式转换。 3.5.1 隐式转换 C语言中设定了不同数据参与运算时的转换 规则,编译器会在悄无声息中进行数据类型 的转换,进而计算出最终结

24、果,这就是隐式 转换。 3.5.1 隐式转换 int i; i = 2 + A; 先计算“=”号右边的表达式,字符型和整型混合运算,按 照数据类型转换先后顺序,把字符型转换为int类型65,然后 求和得67,最后把67赋值给变量i。 double d; d = 2 + A + 1.5F; 先计算“=”号右边的表达式,字符型、整型和单精度float 类型混合运算,因为有浮点型参与运算,“=”右边表达式的结 果一定是double类型,按照数据类型转换顺序,把字符型转换 为类型65.0,2转换为2.0,1.5F转换为1.5,最后把双精度浮 点数68.5赋值给变量d。 3.5.1 隐式转换 上述情况都

25、是有低精度类型向高精度类型的转 换,如果逆向转换,可能会出现丢失数据的危险, 编译器会以警告的形式给出提示。例如: int i; i = 1.2; 浮点数1.2舍弃小数位后,把整数部分1赋值给 变量i。如果i=1.9,运算后变量i的值依然是1,而 不是2。 注注 意意:把浮点数转换为整数,直接舍弃小数位。 3.5.1 隐式转换 【范例范例3-4】 整型和浮点型数据类型间的整型和浮点型数据类型间的 隐式类型转换。隐式类型转换。 01 #include 02 int main(void) 03 04 int i; 05 i=1+2.0*3+1.234+c-A; /*混合运算*/ 06 printf

26、(%dn,i); /*输出i*/ 07 return 0; 08 3.5.2 显式转换 隐式类型转换编译器是会产生警告的,提示 程序存在潜在的隐患。如果非常明确的希望 转换数据类型,这就需要用到显式类型转换 了。 显式转换格式如下所示: (类型名称) 变量或者常量 或者 (类型名称) (表达式) 3.5.2 显式转换 例如,需要把一浮点数,以整数的形式使用printf()函数输出, 怎么办?就可以调用显示类型转换。 float f=1.23; printf(%dn,(int)f); 可以得到输出结果1,没有因为调用的printf()函数格式控 制列表和输出列表前后类型不统一导致程序报错。 继续分析上例,显示类型转换只是把f小数位直接

温馨提示

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

评论

0/150

提交评论