c语言变量类型自动转换,轻松上手C语言数据类型转换,零基础教程自动和强制类型转换...

1d53fb419cae650df5dbc66cd385adcf.png

数据类型转换

数据类型转换就是将数据(变量、数值、表达式的结果等)从一种类型转换为另一种类型。

自动类型转换

自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。

1) 将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换,例如:

floatf = 100;

100 是 int 类型的数据,需要先转换为 float 类型才能赋值给变量 f。再如:

intn = f;

f 是 float 类型的数据,需要先转换为 int 类型才能赋值给变量 n。

在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型转换为左边变量的类型,这可能会导致数据失真(数据输入和输出不一致),或者精度降低;所以说,自动类型转换并不一定是安全的。对于不安全的类型转换,编译器一般会给出警告。 在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后再进行计算。转换的规则如下:

转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。例如,int 和 long 参与运算时,先把 int 类型的数据转成 long 类型后再进行运算。

所有的浮点运算都是以双精度进行的,即使运算中只有 float 类型,也要先转换为 double 类型,才能进行运算。

char 和 short 参与运算时,必须先转换成 int 类型。

b882bca932eb158d9c316afe15da1bbe.png

自动类型转换示例:

#include

intmain()

{

floatPI = 3.14159;

ints1, r = 5;

doubles2;

s1 = r * r * PI;

s2 = r * r * PI;

printf("s1=%d, s2=%f\n", s1, s2);

return0;

}

运行结果:s1=78, s2=78.539749

在计算表达式r*r*PI时,r 和 PI 都被转换成 double 类型,表达式的结果也是 double 类型。但由于 s1 为整型,所以赋值运算的结果仍为整型,舍去了小数部分,导致数据精度丢失。

强制类型转换

自动类型转换是编译器根据代码的上下文环境自行判断的结果,有时候并不是那么“智能”,不能满足所有的需求。如果需要,程序员也可以自己在代码中明确地提出要进行类型转换,这称为强制类型转换。

强制类型转换的格式为:

(type) expression

type为目标类型名称,expression为表达式。例如:

(float) a;  //将变量 a 转换为float类型

(int)(x+y);  //把表达式 x+y 的结果转换为int整型

(float) 100;  //将数值 100(默认为int类型)转换为float类型

下面是一个需要强制类型转换的经典例子:

#include 

intmain()

{

intsum= 315;  //总数

intcount= 7;  //数目

doubleaverage;  //平均数

average = (double)sum/count;

printf("Average is %lf!\n", average);

return0;

}

output:Averageis44.714286!

sum 和 count 都是 int 类型,如果不进行干预,那么sum / count的运算结果也是 int 类型,小数部分将被丢弃;虽然是 average 是 double 类型,可以接收小数部分,但是心有余力不足,小数部分提前就被“阉割”了,它只能接收到整数部分,这就导致除法运算的结果严重失真。

既然 average 是 double 类型,为何不充分利用,尽量提高运算结果的精度呢?为了达到这个目标,我们只要将 sum 或者 count 其中之一转换为 double 类型即可。上面的代码中,我们将 sum 强制转换为 double 类型,这样sum / count的结果也将变成 double 类型,就可以保留小数部分了,average 接收到的值也会更加精确。

注意不要写作(double) (sum / count),这样写运算结果将是 44.000000,仍然不能保留小数部分。

好了,C语言类型转换就介绍到这里,大家可以先练习一下,后面介绍复杂的示例。

【编辑推荐】

【责任编辑:姜华 TEL:(010)68476606】

点赞 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值