0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是数据类型转换

汽车电子技术 来源:C语言Plus 作者: Maye426 2023-02-27 15:04 次阅读

数据类型转换

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

自动类型转换

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

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

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

int n = f;

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

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

  1. 在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后再进行计算。转换的规则如下:
  • 转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。例如,int 和 long 参与运算时,先把 int 类型的数据转成 long 类型后再进行运算。
  • 所有的浮点运算都是以双精度进行的,即使运算中只有 float 类型,也要先转换为 double 类型,才能进行运算。
  • char 和 short 参与运算时,必须先转换成 int 类型。

图片

自动类型转换示例:

#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) expression

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

(float) a;  //将变量 a 转换为 float 类型
 (int)(x+y);  //把表达式 x+y 的结果转换为 int 整型
 (float) 100;  //将数值 100(默认为int类型)转换为 float 类型

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

#include 
 int main()
{    
     int sum = 315;  //总数    
     int count = 7;  //数目    
     double average;  //平均数    
     average = (double) sum / count;    
     printf("Average is %lf!\\n", average);    
     return 0;
 }
 output:Average is 44.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,仍然不能保留小数部分。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数值
    +关注

    关注

    0

    文章

    79

    浏览量

    14290
  • 变量
    +关注

    关注

    0

    文章

    595

    浏览量

    28112
  • 数据类型
    +关注

    关注

    0

    文章

    227

    浏览量

    13498
收藏 人收藏

    评论

    相关推荐

    JAVA语言的数据类型转换

    JAVA语言的数据类型转换很多场合需要用到类型转换。例如,要把一个整型变量作为字符型变量来使用,就需要使用类型
    发表于 12-06 00:30

    【初级】labview教程每日一教之数据文件操作+数据类型转换

    .[hide][/hide]13数据类型转换在使用LabVIEW编程过程中,已有的数据类型不能满足我们进一步处理的需要,常常需要对数据类型进行转换
    发表于 11-07 10:01

    串口数据类型转换问题

    串口接收到的二进制数据,到LabVIEW后被转换为字符串格式,这个过程怎么做?
    发表于 05-09 11:33

    labview 输出数据类型转换

    问题,DAQmx输出的是1D DBL的数组,经过数组子集与时间标识常量相组合使用的是捆绑吗?里面时间变量t0、dt如何设置?加入了时间常量怎么在输出端输出和示波器想匹配的数据类型
    发表于 10-29 13:21

    数据类型转换

    请问碰到这种情况该如何进行转换呢?
    发表于 11-14 14:38

    关于数据类型转换的问题

    如图,最右边的反馈节点输出M序列。这个M序列的数据类型是布尔型。楼主想把M序列的数据类型转换成布尔型数组。想了好久都不知道该怎么操作。希望能有人解答。楼主不胜感激
    发表于 04-27 21:07

    使用ActiveX函数与MATLAB建立连接时,变体数据类型转换出现问题,应该怎么解决啊

    使用ActiveX函数与MATLAB接口创建一个随机值矩阵并在MATLAB软件中显示该矩阵图形,变体数据类型转换出现问题,应该怎么解决啊
    发表于 04-26 15:53

    请问使用强制数据类型转换函数的时候,数据类型type端该如何设置,才能使数据成功转换类型

    本帖最后由 一只耳朵怪 于 2018-6-26 08:51 编辑 使用强制数据类型转换函数的时候,数据类型type端该如何设置,才能使数据成功
    发表于 06-25 20:33

    请问28069的CLA不支持数据类型转换吗?

    = AdcResult.ADCRESULT8;// AdcResult.ADCRESULT8的值为0x0FFF;// 执行下面的语句之后lValue = 0lValue = AdcResult.ADCRESULT8;// AdcResult.ADCRESULT8的值为0x0FFF;难道28069的CLA不支持数据类型
    发表于 12-17 14:45

    数据类型如何转换

    unsigned int num = 0;unsigned char i = 0x12;num = i;程序执行后,是不是把 i 的值赋给num的低8位、、、、、、、、、、
    发表于 06-16 04:35

    辐照度计中串行通讯数据类型转换的研究

    本文探讨了上位机利用MSCOMM 与辐照度计进行串行通讯过程中数据类型转换的问题。分析了VC++6.0 环境下串行通讯中几种特殊数据结构间的关系,总结出了发送及接收数据时可用的几
    发表于 12-12 15:16 14次下载

    LabVIEW初级教程之数据类型转换的详细资料说明

    在使用LabVIEW编程过程中,已有的数据类型不能满足我们进一步处理的需要,常常需要对数据类型进行转换。比如不同表示法的数值类型之间转换,或
    发表于 03-24 15:03 26次下载
    LabVIEW初级教程之<b class='flag-5'>数据类型</b><b class='flag-5'>转换</b>的详细资料说明

    SpinalHDL中Bundle数据类型转换

    SpinalHDL中Bundle与SystemVerilog中的packed struct很像,在某些场景下,与普通数据类型之间的连接赋值可以通过asBits,assignFromBits来实现。
    的头像 发表于 10-17 09:51 999次阅读

    什么是数据类型转换

    常用的3种数据类型:1、Python数据类型第一种:字符串(str)。 2、Python数据类型第二种:整数(int)。 3、Python数据类型第三种:浮点数(float)。
    的头像 发表于 02-23 15:21 579次阅读

    GaussDB数据类型转换介绍

    数据类型转换在实际应用中非常常见。GaussDB 作为一款企业级分布式关系型数据库,在实际业务场景使用中,也会避免不了数据类型转换。以下是
    的头像 发表于 06-05 16:29 527次阅读
    GaussDB<b class='flag-5'>数据类型</b><b class='flag-5'>转换</b>介绍