📜  C中的隐式类型转换(带示例)

📅  最后修改于: 2021-05-25 23:44:16             🧑  作者: Mango

先决条件:数据类型,类型转换

隐式类型转换也称为“自动类型转换”。它由编译器自行完成,而无需用户的任何外部触发。它通常在表达式中存在多个数据类型时发生。在这种情况下,进行类型转换(类型提升)以避免数据丢失。变量的所有数据类型都将升级为具有最大数据类型的变量的数据类型。

在C中进行隐式类型转换的方式有很多,例如:

  • 转换排名
    可以将整数和浮点算术类型从1分配给9 。这个比例在理论上是准确的,但实际实施并不容易。长双实数的排名高于长实数,而短整数的排名则高于图中的字符。
  • 赋值表达式中的转换
    赋值操作中有两个操作数和一个赋值运算符。等级差异决定右表达的提升和降级,以使左右表达的等级相等。提升意味着正确的表达方式是低级的。降级意味着正确的表达方式具有较高的等级。
  • 晋升
    晋升不会造成任何问题。右表达的等级被提升到左表达的等级。表达式的值是升级后正确的表达式的值。

    例子:

    bool        x = true;
    char        y = ‘X’;
    int         i = 123;
    Long double d = 1234.5;
    
    y = x;   // value of y is SOH (ASCII 1)
    i = y;   // value of i is 88
    d = x;   // value of d is 1.0
    d = i;   // value of d is 1234.0
    
    *Here SOH is Start of Header
    
  • 降级
    降级可能会也可能不会造成问题。如果左表达式的变量大小可以容纳表达式的值,则不会出现问题,但结果可能与预期的有所不同。任何实数或整数值都可以分配给布尔变量。如果right表达式的值为零,则表示存储了false(0) 。并且,如果该值不是零,即正数或负数,则表示存储了true(1)

    将整数或实数值分配给字符变量时,数字的最低有效字节将转换为字符并存储。当将实值存储在整数变量中时,仅分配整数部分,并且除去小数。但是,如果该整数值大于可以存储的最大值,则将获得不可预测的结果。

    同样,如果将长型double值存储在float型变量中,则仅当该值适合时结果才有效,否则非常大的值将变得无效
    例子:

    bool  b = false;
    char  c = ‘X’;
    short s = 98;
    int   j = INT_MAX;
    int   k = 88;
    
    b = c;     // value of b is 1 (true)
    s = j;     // value of s is unpredictable
    c = k + 1; // demotion: value of c is ‘Y’
    
  • 其他二进制表达式中的转换
    其他二进制表达式有不同的规则集,有时它们变得复杂,因此将它们概括为以下步骤:
    1. 排名较高的操作数是使用上图所示的排名确定的。
    2. 排名较低的操作数被提升到步骤1中定义的等级。
    3. 使用具有提升等级的类型的表达值来执行该操作。

    例子:

    bool        x = true;
    char        y = ‘X’;
    int         i = 123;
    short       s = 98;
    long double d = 1234.5678;
    
    x + y;   // b is promoted, result is ‘Y’ (‘X’ + 1)
    i * s;   // result is an int
    d * c;   // result is long double
    

下面的示例演示数字类型的隐式类型转换,以便更好地理解。

// C program to demonstrate Implicit
// Type Conversion of numeric types
  
#include 
#include 
  
int main(void)
{
    // Local Declarations
    bool b = true;
    char c = 'X';
    float d = 1234.5;
    int i = 123;
    short s = 98;
  
    // Statements
    printf("bool + char is char:     %c\n", b + c);
    printf("int * short is int:      %d\n", i * s);
    printf("float * char is float:   %f\n", d * c);
  
    // bool promoted to char
    c = c + b;
  
    // char promoted to float
    d = d + c;
  
    b = false;
  
    // float demoted to bool
    b = -d;
  
    printf("\nAfter execution \n");
    printf("char + true:     %c\n", c);
    printf("float + char:    %f\n", d);
    printf("bool = -float:   %d\n", b);
  
    return 0;
}
输出:
bool + char is char:     Y
int * short is int:      12054
float * char is float:   108636.000000

After execution 
char + true:     Y
float + char:    1323.500000
bool = -float:   1
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。