算术运算时会进行类型转换
C语言会按照某些规则对操作数类型进行隐式转换, 总体的规则是把较低的类型(占位少的)转换成较高的类型(占位多),运算结果为较高的类型。在没有unsigned类型操作数参与时,一般按照下面的规则进行转换:
- 如果一个操作数类型是long double类型,则另一个操作数也转换成long double型
- 如果一个操作数类型是double类型,则另一个操作数也转换成double型
- 注意float类型不会自动转换成double类型
- 如果一个操作数类型是float类型,则另一个操作数也转换成float型
- 将char和short类型转换成int类型
- 如果一个操作数类型是long类型,则另一个操作数也转换成long型
代码示例
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a = 10;
float f = 11.5;
char ca = '2'; // ASCII-50
printf("int + float is float: %f\n", a + f);
printf("int + char is int: %d\n", a + ca);
return 0;
}
运行结果:
int + float is float: 21.500000
int + char is int: 60
赋值时会进行类型转换
- 右侧的值会转换成左侧的类型
- 当右侧的值占位超过左侧类型的占位时,会出现溢出现象
- float类型到int类型,小数点后的部分会被截断
代码示例
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a = 2;
float f = 11.5;
char ca = '2'; // ASCII-50
a = f; // 小数部分截断
printf("a is : %d\n", a);
a = 257;
ca = a; //溢出256-》0 257-》1
printf("ca is: %d\n", ca);
return 0;
}
运行结果:
a is : 11
ca is: 1
函数传参时会进行类型转换
- 和赋值规则类似
- char和short会转换成int
- float会转换成double
代码示例
#include <stdio.h>
double sum(int a, double b);
int main(int argc, char const *argv[])
{
float f = 11.5;
char ca = '2'; // ASCII-50
printf("float + ca using sum return double:%f\n", sum(ca, f));
return 0;
}
double sum(int a, double b){
return a + b;
}
运行结果:
float + ca using sum return double:61.500000
强制类型转换
我们可以使用强制类型转换操作符,显示将表达式转换成某种类型。
(类型名) 表达式;// 将表达式计算的值赋值给类型名的变量,然后用该变量替换
注意 显示转换使用不当,会引发一些错误。
代码示例
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a = 10;
float f = 11.5;
char ca = '2'; // ASCII-50
ca = (char)258; //显示将int转换成char,会溢出
a = (int)f;
printf("ca:%d\n", ca);
printf("a:%d\n", a);
return 0;
}
运行结果:
ca:2
a:11
5833

被折叠的 条评论
为什么被折叠?



