C 语言中的类型转换
C 编译器会尝试进行数据类型转换,尤其是在表达式中出现不同的数据类型时。有时,编译器会自行执行转换(隐式类型转换),以使数据类型彼此兼容。在其他情况下,C 编译器会强制执行转换(显式类型转换),这由类型转换运算符执行。
C 语言中的隐式类型转换
在 C 语言中,当编译器将赋值给变量的值的类型转换为另一种数据类型时,会自动进行隐式类型转换。通常,当将字节大小较小的类型赋值给"较大"的数据类型时,就会发生这种情况。在这种隐式数据类型转换中,数据完整性得以保留。
在执行隐式或自动类型转换时,C 编译器遵循类型提升的规则。通常,遵循的原则如下:
字节型和短整型值:它们会被提升为 int 型。
如果一个操作数是 long 型:整个表达式会被提升为 long 型。
如果一个操作数是 float 型:整个表达式会被提升为 float 型。
如果任何一个操作数是 double 型:结果会被提升为 double 型。
整数提升
整数提升是指将小于 int 或 unsigned int 的整数类型值转换为 int 或 unsigned int 的过程。
示例
考虑一个将字符与整数相加的示例:-
#include <stdio.h> int main(){ int i = 17; char c = 'c'; /* ASCII 值为 99 */ int sum; sum = i + c; printf("Value of sum: %d ", sum); return 0; }
输出
运行此代码时,将产生以下输出 -
Value of sum: 116
此处,sum 的值为 116,因为编译器在执行实际加法运算之前进行了整数提升,并将"c"的值转换为 ASCII 码。
常规算术转换
常规算术转换会隐式执行,以将其值转换为通用类型。编译器首先执行整数提升;如果操作数仍然具有不同的类型,则将它们转换为以下层次结构中最高的类型 -

示例
以下是另一个隐式类型转换的示例 -
#include <stdio.h> int main(){ char a = 'A'; float b = a + 5.5; printf("%f", b); return 0; }
输出
运行代码并检查其输出 −
70.500000
上述代码运行时,char 变量"a"(其 int 等效值为 70)被提升为 float 类型,因为加法表达式中的另一个操作数是浮点数。
C 语言中的显式类型转换
当需要将一个字节大小较大的数据类型转换为另一个字节大小较小的数据类型时,需要明确告知编译器您的意图。这称为显式类型转换。
C 语言提供了类型转换运算符。您需要将数据类型放在要转换的操作数前的括号中。
type2 var2 = (type1) var1;
请注意,如果 type1 的长度小于 type2,则无需进行这种显式类型转换。只有当 type1 的长度大于 type2 时,才应该使用类型转换运算符。
当我们想要将较大的数据类型变量降级为相对较小的变量,或者在不相关的类型之间转换(例如将 float 转换为 int)时,就需要进行类型转换。
示例
考虑以下代码 -
#include <stdio.h> int main(){ int x = 10, y = 4; float z = x/y; printf("%f", z); return 0; }
输出
运行此代码后,您将获得以下输出 -
2.000000
我们预期结果为 10/4(即 2.5),但结果却显示为 2.000000。这是因为除法表达式中的两个操作数都是 int 类型。在 C 语言中,除法运算的结果始终是字节长度较大的数据类型。因此,我们必须将其中一个整数操作数强制转换为浮点型,如下所示 -
示例
查看此示例 -
#include <stdio.h> int main(){ int x = 10, y = 4; float z = (float)x/y; printf("%f", z); return 0; }
输出
运行代码并检查其输出 −
2.500000
如果我们修改表达式,将除法本身强制转换为浮点数,结果将会有所不同。
C 语言中的类型转换函数
标准 C 库包含许多执行类型转换的函数。部分函数的说明如下 -
atoi() 函数
atoi() 函数将字符串转换为整数值。该函数在 stdlib.h 头文件中声明。
示例
以下代码使用 atoi() 函数将字符串"123"转换为数字 123 -
#include <stdio.h> #include <stdlib.h> int main(){ char str[] = "123"; int num = atoi(str); printf("%d ", num); return 0; }
输出
运行代码并检查其输出 −
123
itoa() 函数
您可以使用 itoa() 函数将整数转换为以空字符结尾的字符串。该函数在 stdlib.h 头文件中声明。
示例
以下代码使用 itoa() 函数将整数 123 转换为字符串 "123" −
#include <stdio.h> #include <stdlib.h> int main(){ int num = 123; char str[10]; itoa(num,str, 10); printf("%s ", str); return 0; }
输出
运行代码并检查其输出 −
123
其他使用类型转换的示例包括以下内容 −
malloc() 函数 − malloc() 函数是一个动态内存分配函数。
int *ptr = (int*)malloc(n * sizeof(int));
函数参数和返回值 − 您可以将类型转换运算符应用于形式参数或用户定义函数的返回值。
示例
以下是一个例子 −
#include <stdio.h> #include <stdlib.h> float divide(int, int); int main(){ int x = 10, y = 4; float z = divide(x, y); printf("%f", z); return 0; } float divide(int a, int b){ return (float)a/b; }
输出
运行此代码时,将产生以下输出 -
2.500000
在 C 语言中使用隐式或显式类型转换有助于提高类型安全性和代码可读性,但也可能导致精度损失,并且其复杂的语法可能会造成混淆。