zoukankan      html  css  js  c++  java
  • C语言数据类型转换

    在嵌入式开发中,常常涉及到数据类型的转换。经过比较,将几种经典案例总结如下。欢迎大家交流。


    1、int 与 float 的转换

    1 int a = 3;
    2 int b = 4;
    3 float c;
    4 c = a/b;

    上面代码运行结果为0.000000

    int a = 3;
    int b = 4;
    float c;
    c = (float)a/b;

    上面代码运行结果为0.750000

    1 int a = 3;
    2 int b = 4;
    3 float c;
    4 c = (float)(a/b);

    上面代码运算结果为0.000000

    1 int a = 3;
    2 int b = 4;
    3 float c;
    4 c = a/(float)b;

    上面代码运算结果为0.750000

       第一段代码,a为int类型,b为int类型,int类型的除法只保留整数。然后等式右边的数据类型向等式左边的数据类型隐式转换。

       第二段代码,将a转为float类型,然后在与b相除。b是int类型,a是float类型。b向a的类型转换。则全部为float类型。故计算结果为浮点型。

       第三段代码,使用括号将a/b先运算,由于是整数的除法,所以运算结果为0,又因为等号右边自动向等号左边数据类型转化,最终为0.000000。

            第四段代码,将b转为float类型,然后在被a除,int除以float,低类型自动向高类型转换。a/b变为float类型除法。故计算结果为0.000000。

      总结:等号右边的数据类型会自动向等号左边的数据类型转换

         算式中,若存在数据类型不同的数据,等级的数据类型自动向等级的数据类型转换。


    2、float向int类型转换

    1 int a;
    2 float b = 1.5f;
    3 float c = 4.9f;
    4 a = c/b;

    上面代码运算结果为3.

    1 int a;
    2 float b = 1.5f;
    3 float c = 4.9f;
    4 a = (int)c/b;

    上面代码运算结果为2.

    1 int a;
    2 float b = 1.5f;
    3 float c = 4.9f;
    4 a = (int)(c/b);

    上面代码运算结果为3.

      上面的代码与int转float原理类似。在这里就不重复分析。若有疑问,欢迎留言。


    3、函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。

     1 float ADD(float a,float b)
     2 {
     3     
     4     float c;
     5                 printf("a=%f
    ",a);
     6     c = a+b+0.1f;
     7                 printf("c=%f
    ",c);
     8     return c;
     9 }
    10 
    11 int main(void) { 
    12 
    13     int a = 3;
    14     int b = 4;
    15     
    16     int d;
    17     
    18     d = ADD(a,b);
    19     
    20             printf("d=%d
    ",d);
    21     return 0;
    22 }    

    上面代码运行结果为:a = 3.000000,c = 7.100000,d = 7


     4、unsigned int 与int的互相转化问题

    1 unsigned int a = 6;
    2 int b = -20;
    3 (a+b)>6?printf(">6
    "):printf("<6
    ");

    上面的代码运行结果为>6.

      当表达式中同时存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。也就是说,b从int类型转为unsigned int类型时,数据发生了变化。

    如果您使用的嵌入式机时16为机,那么b的二进制为1111 1111 1110 1100,转化为十六进制为:0xFFEC,转化为十进制为65516。65516+6>6。

      如果int >0,那么转化为unsigned int就不会发生这样的数据跳变。

      那么,负数的int值该如何转为unsigned int类型呢?

      尽量避免吧。转换器来非常麻烦


    参考文献:(更多经典,尽在参考文献哟)

    [1].https://bbs.csdn.net/topics/30444126

    [2].https://blog.csdn.net/yinzewen123/article/details/80547836 

    [3].https://wenda.so.com/q/1534046502210162

  • 相关阅读:
    Sysinternals Suite
    扩展Visual Studio Test Project:自定义TestClassAttribute
    扩展Visual Studio Test Project:自定义TestClassAttribute
    SQL Server Single-user Mode
    MAXDOP(max degree of parallelism)
    关于log4net
    Go 切片的一种有趣内存泄漏方式
    Go 中的内联优化
    优化 Golang 服务来减少 40% 以上的 CPU
    Go 编译器内部知识:向 Go 添加新语句-第 2 部分
  • 原文地址:https://www.cnblogs.com/cjyc/p/13705962.html
Copyright © 2011-2022 走看看