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

自动类型转换

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

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

float f = 150;

150 是 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<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

在计算表达式rrPI时,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 <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 接收到的值也会更加精确。

在这段代码中,有两点需要注意:
1 . 对于除法运算,如果除数和被除数都是整数,那么运算结果也是整数,小数部分将被直接丢弃;如果除数和被除数其中有一个是小数,那么运算结果也是小数。

2 . ( )的优先级高于/,对于表达式(double) sum / count,会先执行(double) sum,将 sum 转换为 double 类型,然后再进行除法运算,这样运算结果也是 double 类型,能够保留小数部分。注意不要写作(double) (sum / count),这样写运算结果将是 3.000000,仍然不能保留小数部分。

类型转换只是临时性的

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

#include <stdio.h>
int main(){double total = 400.8;  //总价int count = 5;  //数目double unit;  //单价int total_int = (int)total;unit = total / count;printf("total=%lf, total_int=%d, unit=%lf\n", total, total_int, unit);return 0;
}

运行结果:

total=400.800000, total_int=400, unit=80.160000

注意看第 6 行代码,total 变量被转换成了 int 类型才赋值给 total_int 变量,而这种转换并未影响 total 变量本身的类型和值。如果 total 的值变了,那么 total 的输出结果将变为 400.000000;如果 total 的类型变了,那么 unit 的输出结果将变为 80.000000。

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

在C语言中,有些类型既可以自动转换,也可以强制转换,例如 int 到 double,float 到 int 等;而有些类型只能强制转换,不能自动转换,例如 void * 到 int *,int 到 char * 等。

可以自动转换的类型一定能够强制转换,但是,需要强制转换的类型不一定能够自动转换。

可以自动进行的类型转换一般风险较低,不会对程序带来严重的后果,例如,int 到 double 没有什么缺点,float 到 int 顶多是数值失真。只能强制进行的类型转换一般风险较高,例如,char * 到 int * 就是很奇怪的一种转换,这会导致取得的值也很奇怪,再如,int 到 char * 就是风险极高的一种转换,一般会导致程序崩溃。

你的赞是对我最大的支持!!!

C语言数据类型转换详解相关推荐

  1. Mysql 数据类型转换详解 (convert、cast)

    文章目录 1 概述 2 类型转换 3 扩展 3.1 日期时间函数 1 概述 #mermaid-svg-ItXfZsGMo79eou3H {font-family:"trebuchet ms& ...

  2. C++ 数据类型转换详解之终极无惑

    程序开发环境:VS2017+Win32+Debug 文章目录 1. 隐式数据类型转换 2. 显示数据类型转换 3.C++ 新式类型转换 3.1 const_cast 3.2 static_cast 3 ...

  3. VC常见数据类型转换详解

    我们先定义一些常见类型变量借以说明   int  i  =  100;   long  l  =  2001;   float  f=300.2;   double  d=12345.119;   c ...

  4. Java程序员从笨鸟到菜鸟之(四十四)细谈struts2(七)数据类型转换详解

     本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 Web应用程序的交互都是建立在HTTP之上的,互相传递的都是字符串.也就是说服务器接收到 ...

  5. MapStruct系列(5)-映射器数据类型转换详解

    文章目录 前言 1. 隐式类型转换 2. 映射引用类型 3. 嵌套映射 4. 调用自定义映射方法 5. 调用其他映射器 6. 将映射目标类型传递给自定义映射器 7. 将上下文或状态对象传递给自定义方法 ...

  6. JS数据类型转换详解

    文章内容为所看网课笔记,如有侵权请联系删除 ## JS数据类型 1. 基本数据类型 number.string.undefined.null.boolean.symbol.bigint 2. 引用数据 ...

  7. Mysql 数据类型转换详解

    1 概述 #mermaid-svg-rJkseuZTXKS4FgYE {font-family:"trebuchet ms",verdana,arial,sans-serif;fo ...

  8. Oracle 数据类型转换详解(显示 + 隐式)

    文章目录 1 概述 2 显式转换 2.1 to_char 2.2 to_date 2.3 to_number 3 隐式转换 1 概述 #mermaid-svg-fwPpwf4wV1eBbxmS .la ...

  9. c语言强制类型转换详解

    整形之间的强制转换 在强制类型转换中,我们常用的整形强制转换有无符号和有符号类型的强制转换.所以首先我们得介绍一下计算机中存储数字的方式,计算机中通常以补码的形式来存储数据,以8位数据为例,二进制与有 ...

最新文章

  1. 输入几个数字,用逗号隔开系列例题
  2. 如何处理错误消息Please install the gcc make perl packages
  3. Delphi通过ICMP检测与远程主机连接
  4. 记录一下不能使用let时如何创建局部变量(使用立即执行函数)
  5. SSM项目转Springboot项目
  6. Android学习日志1---在AndroidStudio启动Android 模拟器(ADV)发生的失败
  7. 专硕考数二英二的计算机专业,专硕难度升级!英二改考英一,数二改考数一
  8. 【B站SXT的Java课程中的错误】054 嵌套循环_循环相关练习
  9. NUC970 SD卡驱动(SDIO)
  10. SourceInsight | source insight使用技巧
  11. 解决Win11连接群晖上的L2TP类型无响应的问题
  12. 程序人生:hello程序的P2P
  13. 2015计算机等级考试,2015计算机等级考试
  14. 连续型Hopfield神经网络(SHNN)结构和特点及其能量函数
  15. Nacos -- 下载、安装
  16. 快速判断能否被某个数整除
  17. 集美大学计算机专业2020,2020考研调剂:集美大学计算机应用技术专业调剂信息...
  18. 2021-07-31(测试--总结 上)
  19. 都秀多人视频聊天软件【常用软件】
  20. EndNote的简单使用

热门文章

  1. mysql python连接时、指定的ip地址被转接了_pythonmysql.connector模块使用了错误的IP地址...
  2. dw中html颜色的设置颜色代码,Dreamweaver 如何编辑字体大小颜色
  3. php mvc教程 文档,PHP培训教程教你快速打造PHP MVC框架[PHP基础教程]
  4. PP视频如何将默认缓存清晰度设置成超清
  5. warnings (imported as 'THREE') was not found in 'three'
  6. sql怎么修改服务器角色,sql角色服务器的设置
  7. js异步请求php数据,原生JS发送异步数据请求实例详解
  8. 使用 ref 对已渲染到页面的节点进行标记
  9. linux2019内核版本发布,求问Linux最新内核版本以及发布日期。
  10. 创建mysql视图语法正确的是_MySQL创建视图的语法格式