C 语言中的类型转换:隐式和显式转换

⚡ 智能摘要

C 语言中的类型转换可以将一种数据类型转换为另一种数据类型,可以是编译器自动提升为较小的兼容类型时隐式转换,也可以是程序员使用类型转换运算符强制转换以控制精度并防止出现意外结果时显式转换。

  • 🔄 两种形式: 隐式类型转换会自动执行;显式类型转换需要使用类型转换运算符编写。
  • ⬆️ 促销类型: 将较小的类型转换为较大的兼容类型,例如将 short 转换为 int,会保留值。
  • ✂️ 数据丢失风险: 诸如将 float 转换为 int 之类的类型转换会丢失小数部分,从而失去意义。
  • 🎯 显式语法: 写(类型名称)表达式会强制进行类型转换,就像将整数操作数强制转换为浮点数一样。
  • 🤖 人工智能辅助: AI 助手和 GitHub Copilot 会生成演员表表达式,并标记有风险的缩小范围转换。

C语言中的类型铸造

C 语言中的类型转换是什么?

类型转换是将一种数据类型转换为另一种数据类型。在 C 语言中,它也被称为数据转换或类型转换。它是“C”编程中引入的重要概念之一。

“C”编程提供了两种类型的类型转换操作:

  • 隐式类型转换
  • 显式类型转换

隐式类型转换

隐式类型转换是指在不丢失数据类型原意的情况下转换数据类型。当您想要更改数据类型而不改变存储在其中的值的意义时,这种类型转换至关重要。 变量.

当将值复制到其兼容数据类型时,C 中的隐式类型转换会自动发生。在转换过程中,会应用严格的类型转换规则。如果操作数属于两种不同的数据类型,则具有较低数据类型的操作数会自动转换为较高的数据类型。以下示例中可以看到这种类型的类型转换。

#include<stdio.h>
int main(){
	short a=10; //initializing variable of short data type
	int b; //declaring int variable
	b=a; //implicit type casting
	printf("%d\n",a);
	printf("%d\n",b);
}

输出:

10
10

隐式类型转换

  1. 在给定的示例中,我们声明了一个短数据类型的变量,其值初始化为 10。
  2. 在第二行,我们声明了一个 int 数据类型的变量。
  3. 在第三行,我们将变量 s 的值赋给了变量 a。在第三行,执行了隐式类型转换,因为将 short 数据类型的变量 s 的值复制到 int 数据类型的变量 a 中。

将字符转换为整数

考虑将 ASCII 解码后的字符与整数相加的示例:

#include <stdio.h>
main() {
   int  number = 1;
   char character = 'k'; /*ASCII value is 107 */
   int sum;
   sum = number + character;
   printf("Value of sum : %d\n", sum );
}

输出:

 Value of sum : 108

这里,编译器在执行实际的加法运算之前,通过将“k”的值转换为 ASCII,进行了整数提升。

算术转换层次结构

编译器首先将字符提升为整数。如果操作数仍然具有不同的数据类型,则它们将转换为以下层次结构图中显示的最高数据类型:

算术转换层次结构

考虑以下示例来理解这个概念:

#include <stdio.h>
main() {
   int  num = 13;
   char c = 'k'; /* ASCII value is 107 */
   float sum;
   sum = num + c;
   printf("sum = %f\n", sum );}

输出:

 sum = 120.000000

首先,c 变量被转换为整数,但编译器将 num 和 c 转换为“浮点数”,并将它们相加以产生“浮点数”结果。

关于隐式转换的要点

  • 隐式类型转换也称为标准类型转换。在隐式类型转换中,我们不需要任何关键字或特殊语句。
  • 将较小数据类型转换为较大数据类型也称为类型提升。在上面的例子中,我们也可以说 s 的值被提升为整数类型。
  • 隐式类型转换总是发生在兼容的数据类型中。

我们不能对彼此不兼容的数据类型执行隐式类型转换,例如:

  1. 将浮点数转换为整数将会截断小数部分,从而失去值的意义。
  2. 将双精度型转换为浮点型将会对数字进行四舍五入。
  3. 将 long int 转换为 int 会导致下降ping 多余的高位比特。

以上所有情况,当我们转换数据类型时,值都会失去意义。一般情况下,编译器会警告值失去意义。

C 语言编程 提供了另一种类型转换的方式,即显式类型转换。

显式类型转换

在隐式类型转换中,数据类型会自动转换。在某些情况下,我们可能必须强制进行类型转换。假设我们有一个变量 div,它存储两个操作数的除法,这两个操作数被声明为 int 数据类型。

 int result, var1=10, var2=3;
result=var1/var2;

在这种情况下,对变量 var1 和 var2 执行除法后,变量“result”中存储的结果将为整数格式。每当发生这种情况时,变量“result”中存储的值就会失去其意义,因为它没有考虑两个数字除法中通常会得到的小数部分。

为了在这种情况下强制进行类型转换,我们使用显式类型转换。

它需要一个类型转换运算符。类型转换操作的一般语法如下:

(type-name) expression

在这里,

  • 类型名称是标准的“C”语言数据类型。
  • 表达式可以是常量、变量或实际表达式。

让我们编写一个程序来演示如何使用显式类型转换在 C 中进行类型转换。

#include<stdio.h>
int main()
{
	float a = 1.2;
	//int b  = a; //Compiler will throw an error for this
	int b = (int)a + 1;
	printf("Value of a is %f\n", a);
	printf("Value of b is %d\n",b);
	return 0;
}

输出:

Value of a is 1.200000
Value of b is 2

显式类型转换

  1. 我们已经初始化了 float 类型的变量“a”。
  2. 接下来,我们还有一个整型变量 'b'。由于变量 'a' 和 'b' 的数据类型不同,C 语言不允许使用这样的表达式,并会引发错误。在某些版本的 C 语言中,该表达式会被求值,但结果并非我们所期望的。
  3. 为了避免这种情况,我们将变量“a”转换为浮点型。通过使用显式类型转换方法,我们成功地将浮点型转换为整数数据类型。
  4. 我们打印了 'a' 的值,它仍然是一个浮点数
  5. 经过类型转换后,结果将始终是一个整数“b”。

通过这种方式,我们就可以在 C 编程中实现显式类型转换。

常见问题

类型转换是编译器自动进行的更改;类型强制转换则是您使用强制转换运算符显式请求的更改。强制转换是类型转换的一种形式。

可以。浮点数转整数会截断小数部分,双精度浮点数转浮点数会进行四舍五入,长整型转整数会舍弃高位。扩展类型转换仍然安全。

是的。C 语言允许将一种指针类型强制转换为另一种类型,对象指针可以转换为 void* 类型,反之亦然。对类型不兼容的指针进行解引用会导致未定义行为。

C 语言只有 C 风格的(类型)值强制转换。 C++ 增加了四个更安全的命名类型转换——static_cast、dynamic_cast、const_cast 和 reinterpret_cast——具有更清晰、编译器检查过的意图。

该值仅保留其低位。如果值过大,结果会发生回绕或符号改变,因此请先检查其是否在目标范围内。

优先使用扩展类型转换,在缩小类型转换之前确认值是否合适,并在整数除法之前将一个操作数强制转换为浮点数。启用编译器警告以标记有风险的类型转换。

是的。人工智能助手会根据提示生成角色表达式,解释晋升规则,并在转换可能丢失数据时发出警告。务必编译并测试结果。

GitHub 副驾驶 建议从注释中隐式和显式转换表达式,包括(类型名称)语法。 Rev编译前请查看每项建议,以防数据丢失。

总结一下这篇文章: