在C语言中,当使用多个不同数据类型的变量进行数据运算时,有两种方法可以将同一表达式中不同数据类型的数据转换成同一类型的数据,分别是自动类型转换和强制类型转换(sizeof)。
其中自动类型转换有如下基本规则:
1、当出现在表达式里时,有符号和无符号的char和short类型都将自动被转换为int,在需要的情况下,将自动被转换为unsigned int。
2、在包含两种数据类型的任何运算里,两个值都被转换成两种类型里较高的级别,因为是转换成较大的类型,所以这些转换被称为提升。
3、类型级别从高到低的顺序是long double、double、float、unsigned long、long、unsigned int和int。之所以short和char类型没有出现在此清单中,是因为它们已经被提升到int或也可能被提升到unsigned int。
4、在赋值语句里,计算的最后结果被转换成将要被赋予值的那个变量的类型。这个过程可能导致提升;但也可能导致降级,降级是将一个值转换成一个更低级的类型。
5、当作为函数的参数被传递时,char和short会被转化为int,float会被转换为double。
需要注意的是,提升通常是一个平滑的无损害的过程,但是降级可能导致问题。因为一个较低级别的类型可能不够大,不能存放一个完整的数。如:一个8位的char变量可以存放整数101,但不能存放整数22334;当把浮点类型降级为整数类型时,它们会被趋零截尾或舍入。
基于以上原理,书上举出了一个例子:
int i;
float a=3.5;
i=1;
i=i+a;
对于最后一句i=i+a,书上说i最后的值为4。
对此我表示疑惑,根据第3条基本规则:float级别高于int,那为什么最后i的值不会是4.5?
随后我上机开始试验,如图1。
图1:
在这个程序中,最后的printf输出的就是%d类型,我认为即使i为4.5,结果也会因为被截尾而变成4,所以这个程序并不能说明问题。
因此我对程序作了修改,将printf中i的输出类型改为%f,如图2。
图2:
修改后,程序虽然通过了编译,但是却不能输出结果。
经过前2例,我有了如下判断:
1、printf函数中,指定的输出类型和输出表列的类型如果不一致,能通过编译,但是不能正确输出结果。
2、如果i的值为4.5,那么图2中的printf应该能正确输出结果。所以,程序中最后i的值为4,而且并不是由于printf的%d截尾。
那么,i+a作为不同数据的混合类型运算,基本规则里的第3条又是怎么发挥作用的?
这就有了两种猜想:一种是先把a截尾变成3,再和i相加,最后得到4,就相当于是降级;另一种是先把i的值转化为float型数据1.0(此处相当于提升),再和a相加,最后得到4.5,由于一开始i是定义为int型,所以这里把4.5进行截尾操作得到4。
利用之前的判断1,对程序做了如下的修改,如图3。
图3:
根据图3,能判断出i+a的值为4.5,因为指定输出类型为%d的printf不能输出结果,而指定输出类型为%f的printf可以正确输出。由此可见,猜想2是正确的,
结论:系统在计算本例时,先把i的值转化为float型数据1.0,再和a相加,最后得到4.5,由于一开始i是定义为int型,所以这里把4.5进行截尾操作得到4,最后再把4赋值给整型变量i。
以上观点均为个人看法,如有错误,欢迎大家批评指正
其中自动类型转换有如下基本规则:
1、当出现在表达式里时,有符号和无符号的char和short类型都将自动被转换为int,在需要的情况下,将自动被转换为unsigned int。
2、在包含两种数据类型的任何运算里,两个值都被转换成两种类型里较高的级别,因为是转换成较大的类型,所以这些转换被称为提升。
3、类型级别从高到低的顺序是long double、double、float、unsigned long、long、unsigned int和int。之所以short和char类型没有出现在此清单中,是因为它们已经被提升到int或也可能被提升到unsigned int。
4、在赋值语句里,计算的最后结果被转换成将要被赋予值的那个变量的类型。这个过程可能导致提升;但也可能导致降级,降级是将一个值转换成一个更低级的类型。
5、当作为函数的参数被传递时,char和short会被转化为int,float会被转换为double。
需要注意的是,提升通常是一个平滑的无损害的过程,但是降级可能导致问题。因为一个较低级别的类型可能不够大,不能存放一个完整的数。如:一个8位的char变量可以存放整数101,但不能存放整数22334;当把浮点类型降级为整数类型时,它们会被趋零截尾或舍入。
基于以上原理,书上举出了一个例子:
int i;
float a=3.5;
i=1;
i=i+a;
对于最后一句i=i+a,书上说i最后的值为4。
对此我表示疑惑,根据第3条基本规则:float级别高于int,那为什么最后i的值不会是4.5?
随后我上机开始试验,如图1。
图1:
在这个程序中,最后的printf输出的就是%d类型,我认为即使i为4.5,结果也会因为被截尾而变成4,所以这个程序并不能说明问题。
因此我对程序作了修改,将printf中i的输出类型改为%f,如图2。
图2:
修改后,程序虽然通过了编译,但是却不能输出结果。
经过前2例,我有了如下判断:
1、printf函数中,指定的输出类型和输出表列的类型如果不一致,能通过编译,但是不能正确输出结果。
2、如果i的值为4.5,那么图2中的printf应该能正确输出结果。所以,程序中最后i的值为4,而且并不是由于printf的%d截尾。
那么,i+a作为不同数据的混合类型运算,基本规则里的第3条又是怎么发挥作用的?
这就有了两种猜想:一种是先把a截尾变成3,再和i相加,最后得到4,就相当于是降级;另一种是先把i的值转化为float型数据1.0(此处相当于提升),再和a相加,最后得到4.5,由于一开始i是定义为int型,所以这里把4.5进行截尾操作得到4。
利用之前的判断1,对程序做了如下的修改,如图3。
图3:
根据图3,能判断出i+a的值为4.5,因为指定输出类型为%d的printf不能输出结果,而指定输出类型为%f的printf可以正确输出。由此可见,猜想2是正确的,
结论:系统在计算本例时,先把i的值转化为float型数据1.0,再和a相加,最后得到4.5,由于一开始i是定义为int型,所以这里把4.5进行截尾操作得到4,最后再把4赋值给整型变量i。
以上观点均为个人看法,如有错误,欢迎大家批评指正
发表评论
-
SQL:目录
2013-05-04 22:42 507第一章:关系型数据库管理系统概述 http://131 ... -
SQL:第六课
2013-04-26 17:37 626一、Sybase.PowerDesigner.15.0 二、 ... -
SQL:第五课
2013-04-26 17:34 564第六章: 第七章: 第八章: -
SQL:第四课
2013-04-20 18:56 831第五章: 练习1: USE ... -
SQL:第三课
2013-04-20 11:27 645第四章:DML语句 练习: CREATE DATABA ... -
SQL:第二课
2013-04-17 22:11 713第二章: 第三章: 第二章作业:简易大学教学管理数据库 ... -
SQL:第一课
2013-04-16 22:09 736... -
C语言:目录
2013-04-15 23:11 591第一章:软件开发概述 http://131947319 ... -
C语言:第九课
2013-04-15 22:54 615一、C语言的数据类型包括基本类型(整形,字符型,浮点型),指针 ... -
C语言:第八课
2013-04-15 22:36 703一、在C语言程序设计时 ... -
C语言:第七课
2013-04-15 21:47 547一、数组:按一定顺序排列,具有某种相同性质的同类型变量的集合。 ... -
C语言:第六课
2013-04-06 22:47 561一、循环控制语句控制一个代码块多次执行,直到某个条件满足。重复 ... -
C语言:第五课
2013-04-02 22:41 839一、所有程序在执行时,程序中的语句按其先后顺序执行。这种按照语 ... -
C语言:第四课
2013-04-01 21:28 765一、浮点类型的除法 ... -
C语言:关于溢出
2013-03-31 14:19 1704对于变量的值超出其定 ... -
C语言:第三课
2013-03-30 21:03 8591、计算机在通电状态下 ... -
C语言:第二课
2013-03-28 22:05 10051、C程序是以函数为基 ... -
C语言:第一课
2013-03-27 21:52 7421、软件是为了完成某些特定功能而编制的一到多个程序文件的集合。 ...
相关推荐
论二级C语言之类型的自动转换.pdf
(1)若运算数中有double型或float型,则其他类型数据均转换成double类型进行运算。 (2)若运算数中最长的类型为long型.则其他类型数均转换成long型数。 (3)若运算数中最长类型为int型,则char型也转换成int型进行运算...
浅谈C语言中函数形参为地址类型的定义形式和类型自动转换.pdf
串口转以太网通信源代码C语言C++编写支持多路转换双向通信支持UDP和TCP客户端 提供,带注释,带设计文档 使用说明介绍 1.功能介绍: 完成了多路网口和串口数据转换的功能。 可实现串口接收到的数据,通过网口发送...
数据类型的转换:当计算结果隐含着另外一种数据类型时,数据类型可以自动进行转换,例如,将一个位变量赋给一个整型变量时,位型值自动转换为整型值,有符号变量的符号也能自动进行处理。这些转换也可以用C语言的...
P646.1.11 数据类型:类型转换 P656.2.1 其他运算:逻辑类型 P666.2.2 其他运算:逻辑运算 P676.2.3 其他运算:条件运算与逗号运算 P687.1.1 函数的定义和使用:初见函数 P697.1.2 函数的定义和使用:函数的定义和...
2.1 C语言的数据类型 14 2.2 常量与变量 15 2.2.1 标识符命名 15 2.2.2 常量 16 2.2.3 变量 16 2.3 整型数据 16 2.3.1 整型常量 16 2.3.2 整型变量 17 2.4 实型数据 18 2.4.1 实型常量 18 2.4.2 实型变量 18 2.5 ...
2.1 C语言的数据类型 14 2.2 常量与变量 15 2.2.1 标识符命名 15 2.2.2 常量 16 2.2.3 变量 16 2.3 整型数据 16 2.3.1 整型常量 16 2.3.2 整型变量 17 2.4 实型数据 18 2.4.1 实型常量 18 2.4.2 实型变量 18 2.5 ...
如果两者不一致,则以函数类型为准,自动进行类型转换。 3. 如函数值为整型,在函数定义时可以省去类型说明。 4. 不返回函数值的函数,可以明确定义为“空类型”, 类型说明符为“void”。如例5.3中函数s并不向...
2.12.1 自动转换类型 53 2.12.2 隐式类型转换的规则 54 2.12.3 赋值语句中的隐式类型转换 54 2.13 再谈数值数据类型 55 2.13.1 字符类型 56 2.13.2 字符的输入输出 57 2.13.3 宽字符类型 60 2.13.4 枚举 60 ...
2.1 C语言的数据类型 14 2.2 常量与变量 15 2.2.1 标识符命名 15 2.2.2 常量 16 2.2.3 变量 16 2.3 整型数据 16 2.3.1 整型常量 16 2.3.2 整型变量 17 2.4 实型数据 18 2.4.1 实型常量 18 2.4.2 实型变量 18 2.5 ...
3.1 C语言的数据类型 32 3.2 常量与变量 33 23.2.1 常量和符号常量 33 3.2.2 变量 33 3.3 整型数据 34 3.3.1 整型常量的表示方法 34 3.3.2 整型变量 35 3.4 实型数据 37 3.4.1 实型常量的表示方法 37 3.4.2 实型...
VC++ MFC 经典教程 - 基础篇 1.CP_YourFirstWindowsProgram.mp4 10.MFC_GDI_画直线和曲线.mp4 11.MFC_GDI_画椭圆_多边形及其他形状.mp4 12.MFC_GDI_画笔和画刷.mp4 ...自动类型转换.mp4 47.动态创建对象...
2.员工号为我班同学学号后3位数字,起始为067,在统计多日迟到累计次数过程有文件内容的修改操作和数据类型转换过程,为简化文件操作过程以及后面的查询过程,实际处理的是员工的序号,如员工号为073的记录为07;...
Qt为C++语言增加的特性就是在Qt Core模块里实现的,这些扩展特性由Qt的元对象系统实现,包括信号与槽机制、属性系统、动态类型转换等。 1.2.元对象系统 Qt的元对象系统(Meta-Object-System)提供了对象之间通信的...
第二部分 数据结构篇 042 插入排序 043 希尔排序 044 冒泡排序 045 快速排序 046 选择排序 047 堆排序 048 归并排序 049 基数排序 050 二叉搜索树操作 051 二项式系数递归 052 背包问题 053 顺序表插入...
2.4 在C语言中用什么方法实现抽象数据类型最好? *2.5 在C语言中是否有模拟继承等面向对象程序设计特性的好方法? 2.6 为什么声明externf(structx*p);给我报了一个晦涩难懂的警告信息? 2.7 我遇到这样声明...