C语言数据类型转换.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
自动类型转换 自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。 将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换,例如: float f = 100; 100是int类型的数据,需要先转换为float类型才能赋值给变量f。再如: int n = f; f是float类型的数据,需要先转换为int类型才能赋值给变量n。 在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型转换为左边变量的类型,这可能会导致数据失真,或者精度降低;所以说,自动类型转换并不一定是安全的。对于不安全的类型转换,编译器一般会给出警告。 在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后再进行计算。转换的规则如下: 转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。例如,int和long参与运算时,先把int类型的数据转成long类型后再进行运算。 所有的浮点运算都是以双精度进行的,即使运算中只有float类型,也要先转换为double类型,才能进行运算。 char和short参与运算时,必须先转换成int类型。 下图对这种转换规则进行了更加形象地描述: unsigned也即unsigned int,此时可以省略int,只写unsigned。 自动类型转换示例: #includestdio.h int main() { float PI = 3.14159; int s1, r = 5; double s2; s1 = r * r * PI; s2 = r * r * PI; printf(s1=%d, s2=%f\n, s1, s2); return 0; } 运行结果: s1=78, s2=78.539749 在计算表达式r*r*PI时,r和PI都被转换成double类型,表达式的结果也是double类型。但由于s1为整型,所以赋值运算的结果仍为整型,舍去了小数部分,导致数据失真。 强制类型转换 自动类型转换是编译器根据代码的上下文环境自行判断的结果,有时候并不是那么“智能”,不能满足所有的需求。如果需要,程序员也可以自己在代码中明确地提出要进行类型转换,这称为强制类型转换。 自动类型转换是编译器默默地、隐式地进行的一种类型转换,不需要在代码中体现出来;强制类型转换是程序员明确提出的、需要通过特定格式的代码来指明的一种类型转换。换句话说,自动类型转换不需要程序员干预,强制类型转换必须有程序员干预。 强制类型转换的格式为: (type_name) expression type_name为新类型名称,expression为表达式。例如: (float) a; //将变量a转换为float类型 (int)(x+y); //把表达式x+y的结果转换为int整型 (float) 100; //将数值10(默认为int类型)转换为float类型 下面是一个需要强制类型转换的经典例子: #include stdio.h int main(){ int sum = 103; //总数 int count = 7; //数目 double average; //平均数 average = (double) sum / count; printf(Average is %lf!\n, average); return 0; } 运行结果: Average is 14.714286! sum和count都是int类型,如果不进行干预,那么sum/count的运算结果也是int类型,小数部分将被丢弃;虽然是average是double类型,可以接收小数部分,但是心有余力不足,小数部分提前就被“阉割”了,它只能接收到整数部分,这就导致除法运算的结果严重失真。 既然average是double类型,为何不充分利用,尽量提高运算结果的精度呢?为了达到这个目标,我们只要将sum或者count其中之一转换为double类型即可。上面的代码中,我们将sum强制转换为double类型,这样sum/count的结果也将变成double类型,就可以保留小数部分了,average接收到的值也会更加精确。 在这段代码中,有两点需要注意: 对于除法运算,如果除数和被除数都是整数,那么运算结果也是整数,小数部分将被直接丢弃;如果除数和被除数其中有一个是小数,那么运算结果也是小数。这一点已在《C语言加减乘除运算》中进行了详细说明。 ()的优先级高于/,对于表达式(double)sum/count,会先执行(double)sum,将sum转换为dou

文档评论(0)

jyr0221 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档