Cprogramming 简明教程

Type Conversion in C

C 编译器尝试数据类型转换,特别是在表达式中出现不同数据类型时。在某些时候,编译器会自行转换(隐式类型转换),以便数据类型彼此兼容。在其他情况下,C 编译器强制执行转换(显式类型转换),由类型转换运算符执行。

Implicit Type Conversion in C

在 C 中,当编译器将一个值赋给变量的类型转换为另一个数据类型时,会自动进行隐式类型转换。这通常发生在将一个较小字节大小的类型赋值给一个“较大的”数据类型时。在这种隐式数据类型转换中,会保留数据完整性。

在执行隐式或自动类型转换时,C 编译器遵循类型提升规则。通常,遵循的原则是如下−

  1. 字节和短值:提升为 int。

  2. 如果一个操作数是 long:整个表达式提升为 long。

  3. 如果一个操作数是 float:整个表达式提升为 float。

  4. 如果任何操作数为双精度浮点数:结果将转换为双精度浮点数。

Integer Promotion

整数提升是将类型“小于”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);

   return 0;
}

当你运行这段代码时,它将产生以下输出:

Value of sum: 116

此处,sum 的值为 116,因为编译器正在进行整数提升,并在执行实际加法操作前将 "c" 的值转换为 ASCII。

Usual Arithmetic Conversion

常见的算术转换隐式执行,以将其值转换为通用类型。编译器首先执行整数提升;如果操作数仍具有不同的类型,那么它们将转换为在以下层次结构中出现最高级别的类型:

long double

Example

以下是隐式类型转换的另一个示例:

#include <stdio.h>

int main(){

   char a = 'A';
   float b = a + 5.5;

   printf("%f", b);

   return 0;
}

运行代码并检查其输出:

70.500000

当上述代码运行时,字符变量 "a"(其 int 等效值为 70)将转换为浮点数,因为加法表达式中的另一个操作数为浮点数。

Explicit Type Conversion in C

当您需要将字节大小较高的数据类型转换为字节大小较低的其他数据类型时,您需要明确告知编译器您的意图。这称为显式类型转换。

C 提供了一个类型转换运算符。您需要在要转换的操作数前用括号括住数据类型。

type2 var2 = (type1) var1;

请注意,如果 type1 的长度小于 type2,则您不需要这种显式转换。仅当 type1 的长度大于 type2 时,才应该使用类型转换运算符。

当我们希望将较大数据类型变量降级到较小变量或将其转换为不相关类型(如浮点到整数)时,需要类型转换。

Example

考虑以下代码:-

#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 中,除法操作的结果始终为字节长度较大的数据类型。因此,我们必须将其中一个整数操作数类型转换到浮点,如下所示:

Example

看看这个示例:

#include <stdio.h>

int main(){

   int x = 10, y = 4;
   float z = (float)x/y;

   printf("%f", z);

   return 0;
}

运行代码并检查其输出:

2.500000

如果我们更改表达式,以便将除法本身转换为浮点数,结果将不同。

Typecasting Functions in C

标准 C 库包含许多执行类型转换的函数。此处解释了一些函数:

The atoi() Function

atoi() 函数将字符串字符转换为整数。此函数在 stdlib.h 头文件中声明。

以下代码使用 atoi() 函数将字符串 "123" 转换为数字 123:

#include <stdio.h>
#include <stdlib.h>

int main(){

   char str[] = "123";
   int num = atoi(str);

   printf("%d\n", num);

   return 0;
}

运行代码并检查其输出:

123

The itoa() Function

您可以使用 itoa() 函数将整数转换为以 null 结尾的字符字符串。此函数在 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\n", str);

   return 0;
}

运行代码并检查其输出:

123

使用类型转换的其他示例包括:

The malloc() Function - malloc() 函数是一个动态内存分配函数。

Int *ptr = (int*)malloc(n * sizeof(int));

In function arguments and return values − 您可以将类型强制转换运算符应用于形式参数或用户定义函数的返回值。

示例如下:

#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 中使用隐式或显式类型转换有助于类型安全和提高代码可读性,但它也可能导致精度降低,并且其复杂的语法可能会令人困惑。