C 语言中的类型转换
"类型转换"是指将一种数据类型转换为另一种数据类型。它也称为"类型转换"。有时,编译器会自行执行转换(隐式类型转换),以使数据类型相互兼容。
在其他情况下,C 编译器会强制执行类型转换(显式类型转换),这是由类型转换运算符引起的。例如,如果您想将"long"值存储为一个简单的整数,则可以将"long"类型转换为"int"。
您可以使用类型转换运算符将值从一种类型显式转换为另一种类型 -
(type_name) expression
示例 1
请考虑以下示例 -
#include <stdio.h> int main() { int sum = 17, count = 5; double mean; mean = sum / count; printf("Value of mean: %f ", mean); }
输出
运行代码并检查其输出 −
Value of mean: 3.000000
我们预期结果为 17/5,即 3.4,但结果却显示为 3.000000,因为除法表达式中的两个操作数均为 int 类型。
示例 2
在 C 语言中,除法运算的结果始终采用字节长度较大的数据类型。因此,我们必须将其中一个整数操作数强制转换为 float 类型。
强制类型转换运算符使一个整数变量除以另一个整数变量的操作执行浮点运算 -
#include <stdio.h> int main() { int sum = 17, count = 5; double mean; mean = (double) sum / count; printf("Value of mean: %f ", mean); }
Output
当编译并执行上述代码时,它会产生以下结果 -
Value of mean: 3.400000
需要注意的是,强制类型转换运算符的优先级高于除法,因此 sum 的值首先被转换为 double 类型,最后除以 count 得到一个 double 值。
类型转换可以是隐式的,由编译器自动执行,也可以通过使用强制类型转换运算符显式指定。在需要进行类型转换时,使用强制类型转换运算符被认为是良好的编程习惯。
类型提升规则
在执行隐式或自动类型转换时,C 编译器遵循类型提升规则。通常,遵循的原则如下:
- 字节型和短整型值 - 它们会被提升为 int 型。
- 如果一个操作数是 long - 整个表达式会被提升为 long 型。
- 如果一个操作数是 float - 整个表达式会被提升为 float 型。
- 如果任何一个操作数是 double - 结果会被提升为 double 型。
C 语言中的整数提升
整数提升是将小于 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); }
输出
当编译并执行上述代码时,它会产生以下结果 -
Value of sum: 116
此处,sum 的值为 116,因为编译器在执行实际加法运算之前进行了整数提升,并将 'c' 的值转换为 ASCII 码。
常规算术转换
赋值运算符、逻辑运算符 && 和 || 不会执行常规算术转换。
示例
让我们通过以下示例来理解这个概念 -
#include <stdio.h> int main() { int i = 17; char c = 'c'; /* ASCII 值为 99 */ float sum; sum = i + c; printf("Value of sum : %f ", sum); }
输出
当编译并执行上述代码时,它会产生以下结果 -
Value of sum: 116.000000
这里很容易理解,首先 c 被转换为整数,但由于最终值是双精度数,因此应用通常的算术转换,编译器将 i 和 c 转换为"浮点数"并将它们相加,得到"浮点数"结果。