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

自动类型转换

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

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

float f = 100;

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

int n = f;

f 是 float 类型的数据,需要先转换为 int 类型才能赋值给变量 n。
在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型转换为左边变量的类型,这可能会导致数据失真,或者精度降低;

所以说,自动类型转换并不一定是安全的。对于不安全的类型转换,编译器一般会给出警告。

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

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

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

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

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

unsigned 也即 unsigned int,此时可以省略 int,只写 unsigned。

自动类型转换示例:

#include
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;  //将数值 100(默认为int类型)转换为 float 类型

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

#include
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 转换为 double 类型,然后再进行除法运算,这样运算结果也是 double 类型,能够保留小数部分。

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

类型转换只是临时性的

无论是自动类型转换还是强制类型转换,都只是为了本次运算而进行的临时性转换,转换的结果也会保存到临时的内存空间,不会改变数据本来的类型或者值。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

C语言数据类型转换(自动类型转换 强制类型转换)相关推荐

  1. C语言基础专题 - 数据类型与强制类型转换(编辑中)

    C语言 - 数据类型与强制类型转换 1.C数据类型 可以参考的相关知识链接: C语言基础专题 - 指针 C语言基础专题 - 数组 C语言基础专题 - 字符串 C语言基础专题 - 结构体 C语言基础专题 ...

  2. C++中的向上类型转换和向下类型转换+四种强制类型转换

    转自博客:http://blog.csdn.net/wangweitingaabbcc/article/details/7720979# 在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分 ...

  3. 自动与强制类型转换小总结

    一: 普通类型的类型转换: 当较低类型的数据转换为较高类型时,一般只是形式上有所改变, 而不影响数据的实质内容,(自动) 而较高类型的数据转换为较低类型时则可能有些数据丢失.(强制) 如int a=( ...

  4. c语言字符串强制类型转换,C语言学习九 —头文件强制类型转换错误处理

    预处理器 C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤.简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理.我们将把 C 预处理器( ...

  5. C语言中结构体的强制类型转换

    最近在学习C语言中的Socket,遇到了结构体强制类型转换的问题,在这里记录一下. 我们看一个例子 struct sockaddr_in seraddr;memset(&seraddr, 0, ...

  6. linux 强制类型转换,转载 指针强制类型转换

    当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指针,赋值号的右边是一个指针表达式.在我们前面所举的例子中,绝大多数情况下,指针的类型和指针表达式的类型是一样的,指针所指向的类型和指针表达式 ...

  7. c语言数据的自动转换类型吗,c语言的自动类型转换

    自动转换遵循以下规则: 1)        若参与运算量的类型不同,则先转换成同一类型,然后进行运算. 2)        转换按数据长度增加的方向进行,以保证精度不降低.如int型和long型运算时 ...

  8. html强制类型转换,前端-JS强制类型转换之转换成数字类型

    在上一篇博客<前端-数据类型>中我们说到JavaScript的数据类型.那么下面我们介绍一下JavaScript数据类型强制转换成数字类型. 代码示例 下面的代码中,主要实现将一个全部是数 ...

  9. C语言数据类型转换(自动类型转换+强制类型转换)

    自动类型转换 自动类型转换就是编译器默默地.隐式地.偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生. 1)将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换,例如 floa ...

  10. c语言强制转换字符类型,C语言数据类型转换实例代码

    数据类型转换就是将数据(变量.表达式的结果)从一种类型转换到另一种类型.例如,为了保存小数你可以将int类型的变量转换为double类型. 数据类型转换的一般格式为: (type_name) expr ...

最新文章

  1. 98后常春藤学霸林之秋,一作拿下CVPR最佳论文提名,首次挑战图片翻转不变性假设...
  2. mysql search yum_centos7通过yum安装mysql的方法
  3. 快速问医生如何快速实现 患者与医生即时问诊?
  4. 如何在Linux上安装Composer
  5. 痛失大家!中国科学院院士陈家镛逝世
  6. gps卫星位置计算程序matlab_科研项目 | BD/ GPS卫星导航仿真测试系统研究
  7. golang 复制对象的正确做法
  8. VM安装CentOs7虚拟机后无法上网之解决方法
  9. jfinal项目tomcat下部署
  10. Logisim元件用法详解二:Gates 门
  11. MAVEN下载修改settings.xml
  12. 三星S5P6818之UBOOT网络配置
  13. Riverbed宣布收购领先的Wi-Fi网络提供商Xirrus
  14. python做卡牌游戏_python实现机器人卡牌
  15. iOS开发之高仿斗鱼tv初探
  16. Python爬虫基础:scrapy 框架—ltem和scrapy.Request
  17. 2017ACM-ICPC EC-Final总结
  18. LED升压大电流恒流芯片H6911峰值电流检测 调光辉度65536驱动IC方案
  19. 能转16进制的计算机软件,16进制计算器能否完成各种不同进制的转换?
  20. 关于数据清洗的常见方式

热门文章

  1. weblogic工具_WebLogic Classloader分析工具
  2. AWS上的应用程序自动扩展–选项及其对性能的影响
  3. java ee cdi_Java EE CDI程序化依赖关系消歧示例–注入点检查
  4. Java 9模块服务
  5. c#枚举类似于java_如何在Java中获得类似于C的性能
  6. Oracle MAF中的LOV
  7. 使用自动机的Lucene新的邻近查询
  8. 如何使用Play框架为https配置SSL证书
  9. 碎玻璃:诊断生产Cassandra问题
  10. 使用Byteman和JUnit进行故障注入