【数据类型转换】C语言中的数据类型转换

1.定义

数据类型转换,听这个名字你就懂了,就是将数据从一种类型转换为另一种类型。

2.自动类型转换

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

float f = 100;
//100 是 int 类型的数据,需要先转换为 float 类型才能赋值给变量 f

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

在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型转换为左边变量的类型,这可能会导致数据失真,或者精度降低;所以说,自动类型转换并不一定是安全的。对于不安全的类型转换,编译器一般会给出警告。

有时候,在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后再进行计算。转换的规则如下:

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

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

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

下图对这种转换规则进行了更加形象地描述:

为了让读者更容易的理解自动类型转换,我们举一个例子:

#include<stdio.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 为整型,所以赋值运算的结果仍为整型,舍去了小数部分,导致数据失真。

3.强制类型转换

自动类型转换是编译器根据代码的上下文环境自行判断的结果,有时候并不是那么“智能”,不能满足所有的需求。如果需要,程序员也可以自己在代码中明确地提出要进行类型转换,这称为强制类型转换。
自动类型转换是编译器默默地、隐式地进行的一种类型转换,不需要在代码中体现出来;强制类型转换是程序员明确提出的、需要通过特定格式的代码来指明的一种类型转换。换句话说,自动类型转换不需要程序员干预,强制类型转换必须有程序员干预。

举个例子:

(float) a;  //将变量 a 转换为 float 类型
(int)(x+y);  //把表达式 x+y 的结果转换为 int 整型
(float) 100;  //将数值 100(默认为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 接收到的值也会更加精确。
 

4.自动类型转换 VS 强制类型转换

可以自动转换的类型一定能够强制转换,但是,需要强制转换的类型不一定能够自动转换。现在我们学到的数据类型,既可以自动转换,又可以强制转换,以后我们还会学到一些只能强制转换而不能自动转换的类型。
可以自动进行的类型转换一般风险较低,不会对程序带来严重的后果,例如,int 到 double 没有什么缺点,float 到 int 顶多是数值失真。只能强制进行的类型转换一般风险较高,或者行为匪夷所思,例如,char * 到 int * 就是很奇怪的一种转换,这会导致取得的值也很奇怪,再如,int 到 char * 就是风险极高的一种转换,一般会导致程序崩溃。
使用强制类型转换时,程序员自己要意识到潜在的风险。

5.小结

其实这部分内容不用死记硬背,面试也不会单独问这个,只不过这是基础中的基础,如果你不会的话就会对阅读代码产生障碍 ,而且这个读代码读多了自然懂了。所以我建议,把这篇文章收藏,然后有事没事拿出来看两遍,然后你对这个知识点绝对是了解的很透彻了。

相关推荐

  1. go语言数据类型转换

    2024-01-26 14:44:03       12 阅读
  2. C#类型转换

    2024-01-26 14:44:03       30 阅读
  3. C++类型转换

    2024-01-26 14:44:03       22 阅读
  4. Python数据类型转换

    2024-01-26 14:44:03       36 阅读
  5. cast数据类型转换

    2024-01-26 14:44:03       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-26 14:44:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-26 14:44:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-26 14:44:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-26 14:44:03       20 阅读

热门阅读

  1. 前端demo: 将传入文件压缩到不超过指定大小(M)

    2024-01-26 14:44:03       34 阅读
  2. ubuntu 22.04 怎么安装websocat

    2024-01-26 14:44:03       35 阅读
  3. 【git】记录一个git error解决方法

    2024-01-26 14:44:03       35 阅读
  4. js中将回调地狱改装成promise方式的函数

    2024-01-26 14:44:03       37 阅读
  5. C语言sizeof 不是函数吗?

    2024-01-26 14:44:03       30 阅读
  6. YAML语法记录

    2024-01-26 14:44:03       32 阅读
  7. 关于SQLite 的下载与使用。配合python

    2024-01-26 14:44:03       37 阅读
  8. mysql面试题合集-分布式

    2024-01-26 14:44:03       32 阅读
  9. 玩转浏览器开发者工具

    2024-01-26 14:44:03       35 阅读
  10. shallowRef与shallowReactive

    2024-01-26 14:44:03       30 阅读
  11. IEC60870-5-104规约

    2024-01-26 14:44:03       34 阅读