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