# 数据类型转换 数据类型转换就是将数据(变量、数值、表达式的结果等)从一种类型转换为另一种类型。 ## 自动数据类型转换 自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。 情况一、将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换,例如: ```c float f = 100; ``` 100 是 int 类型的数据,需要先转换为 float 类型才能赋值给变量 f。再如: ```c int n = f; ``` f 是 float 类型的数据,需要先转换为 int 类型才能赋值给变量 n。 在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型转换为左边变量的类型,这可能会导致数据失真,或者精度降低;所以说,自动类型转换并不一定是安全的。对于不安全的类型转换,编译器一般会给出警告。 情况二、在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种数据,然后再进行计算。转换规则如下: - 转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。例如,int 和 long 参与运算时,先把 int 类型的数据转成 long 类型后再进行运算。 - 所有的浮点运算都是以双精度进行的,即使运算中只有 float 类型,也要先转换为 double 类型,才能进行运算。 - char 和 short 参与运算时,必须先转换成 int 类型。 ```mermaid flowchart LR short --> int char --> int int --> unsigned unsigned --> long long --> double float --> double ``` ## 强制类型转换 自动类型转换是编译器根据代码的上下文环境自行判断的结果,有时候并不是那么“智能”,不能满足所有的需求。如果需要,程序员也可以自己在代码中明确地提出要进行类型转换,这称为强制类型转换。 自动类型转换是编译器默默地、隐式地进行的一种类型转换,不需要在代码中体现出来;强制类型转换是程序员明确提出的、需要通过特定格式的代码来指明的一种类型转换。换句话说,自动类型转换不需要程序员干预,强制类型转换必须有程序员干预。 强制类型转换的格式为: ```c (type_name) expression; //type_name为新类型名称,expression为表达式 (float) a; (int) (x+y); (float) 100; ``` 实例 ```c #include int main(int argc, char *argv[]){ int sum = 103; int count = 7; double average; average = (double) sum/count; printf("平均数: %lf!\n", average); return 0; } ``` 在这段代码中,有两点需要注意: - 对于除法运算,如果除数和被除数都是整数,那么运算结果也是整数,小数部分将被直接丢弃;如果除数和被除数其中有一个是小数,那么运算结果也是小数。 - `( )`的优先级高于`/`,对于表达式`(double) sum / count`,会先执行`(double) sum`,将 sum 转换为 double 类型,然后再进行除法运算,这样运算结果也是 double 类型,能够保留小数部分。注意不要写作`(double) (sum / count)`,这样写运算结果将是 3.000000,仍然不能保留小数部分。 ## 类型转换只是临时的 无论是自动类型转换还是强制类型转换,都只是为了本次运算而进行的临时性转换,转换的结果也会保存到临时的内存空间,不会改变数据本来的类型或者值。 ```c #include 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; } ``` ## 自动类型转换VS强制类型转换 在C语言中,有些类型既可以自动转换,也可以强制转换,例如 int 到 double,float 到 int 等;而有些类型只能强制转换,不能自动转换,例如以后将要学到的 void * 到 int *,int 到 char * 等。 可以自动转换的类型一定能够强制转换,但是,需要强制转换的类型不一定能够自动转换。现在我们学到的数据类型,既可以自动转换,又可以强制转换,以后我们还会学到一些只能强制转换而不能自动转换的类型。 可以自动进行的类型转换一般风险较低,不会对程序带来严重的后果,例如,int 到 double 没有什么缺点,float 到 int 顶多是数值失真。只能强制进行的类型转换一般风险较高,或者行为匪夷所思,例如,char * 到 int * 就是很奇怪的一种转换,这会导致取得的值也很奇怪,再如,int 到 char * 就是风险极高的一种转换,一般会导致程序崩溃。 使用强制类型转换时,程序员自己要意识到潜在的风险。