什么是类型转换

类型转换顾名思义,就是转换量的类型。在c语言中,我们在经常定义了一个int类型,即为整数型的变量,那么在输出int类型时我们根据生活中一些问题会发现它需要改为float类型,即为浮点型,否则他就会吞掉你的小数点后面的数字。例如:

1
2
int a=5;
printf("%d",a/2);

那么我们得到的结果为

1
2

那么这里显然程序把我们本来有的2.5的.5吞了(这不明摆着抢劫嘛!!)。所以为了避免程序吞掉我们的东西,我们得提前给他转换类型来保护我们的财产。谨防程序盗贼!!


类型转换类型

在c语言中类型转换分为自动转换(隐式转换)和强制转换。

  • 自动转换(隐式转换):即由编译系统自己完成的我转换,遵循一定规则。
  • 强制转换:即根据自己需求清醒将数据转化为自己需要的类型。

首先我们看个隐式转换例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//假定我们在买水果。
//水果单价为2.3元一斤。
float price=2.5;
//假定我们买5斤。
int num=5;
//那么我们的价格是多少呢
//第一种
float all1=num*price;
printf("%f",all1);
//第二种
int all2=num*price;
printf("%d",all2);
//第三种
double all3=num*price;
printf("%lf",all3);

那么他们分别输出的是:

image-20231029235804892

但是按照严格意义上来讲只有第三种是正确的,第二种不出所料地偷走了我们的小数点,第一种不是很规范。

接着我们看一个强制转换类型:

1
2
3
4
5
6
7
//还是买水果
float price=2.5;
//我们还是买5斤
int num=5;
//价格为
int all=(int)price*num;
printf("%d",all);

输出结果为

image-20231030080719418

这里我们发现,输出结果为10,为什么不是12或者13呢。原因是,我们在price前面加上了(int)后首先会将2.5中的.5抹除(砍价党狂喜),然后再进行计算。

那么这里老板就不愿意了怎么办呢?接下来再看个例子:

1
2
3
4
float price=2.5;
int num=5;
int all=(int)(price*num);
printf("%d",all);

输出结果为

image-20231030081149625

这里我们发现原本12.5变成了12。老板给我门抹了个0(虽然没有上次优惠的多)。这里分析一下代码,程序首先将price *num计算完再进行的类型转换,导致12.5抹去了.5。所以说啊讲价前一定要讲单价(砍价党秘诀)。


类型转换规则

在类型转化中,我们可以用一个图来展示雷响转化的规则。

image-20231030081725173

  • 原则:占用内存字节数少(值域小)的类型,向占用内存字节数多(值域大)的类型转换,以保证精度不降低。

当然这句话反过来就印证了我们上面的情况,即占用字节多的向占用字节少的转换精度会降低,就出现了吞小数点的情况。

在类型转换中()称之为类型转换符,在一个变量前加上只对一个变量进行转换,如果是一个式子就要用括号括起来。原因是(的优先级为2级,比运算符的优先级要高,所以要用括号括起来)。


资料参考

b站的黑马程序员