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\n", 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\n", mean);
}

输出

编译并执行上述代码时,会产生以下结果 -

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 value is 99 */
   int sum;

   sum = i + c;
   printf("Value of sum : %d\n", sum);
}

输出

编译并执行上述代码时,会产生以下结果 -

Value of sum: 116

这里,sum 的值为 116,因为编译器正在执行整数提升并将 'c' 的值转换为 ASCII 码,然后执行实际的加法运算。

通常的算术转换

通常的算术转换不适用于赋值运算符,也不适用于逻辑运算符 && 和 ||。

示例

让我们以以下示例来理解这个概念 -

#include <stdio.h>

int main() {

   int i = 17;
   char c = 'c';  /* ascii value is 99 */
   float sum;

   sum = i + c;
   printf("Value of sum : %f\n", sum);
}

输出

编译并执行上述代码时,会产生以下结果 -

Value of sum: 116.000000

这里,很容易理解首先 c 被转换为整数,但是由于最终值为 double 类型,因此应用了通常的算术转换,编译器将 i 和 c 转换为 'float' 类型并相加,得到一个 'float' 类型的结果。

广告