第4课 类型转换

1. C语言中的类型之间的转换:强制类型转换和隐式类型的转换

#include<stdio.h>

int main()
{
    long l = 800;
    int i = (int)l; //强制类型转换

    short s = 800;
    int k = s; //隐式类型转换,no error,no warning

    return 0;
}

2. 强制类型转换

(1)强制类型转换的语法:(Type)var_name(Type)value

(2)强制类型转换的结果

  ①目标类型能够容纳目标值:结果不变

  ②目标类型不能容纳目标值:结果将产生截断

(3)注意:不是所有的强制类型转换都能成功,当不能进行强制类型转换,编译器将报错。

【编程实例】强制类型转换分析

#include<stdio.h>

struct TS
{
    int i;
    int j;
};

int main()
{
    short s = 0x1122;
    char c = (char)s; //0x22;
    int i = (int)s;   //0x00001122;
    int j = (int)3.1415; //3,直接截断小数部分

    struct TS ts;
    unsigned int p = (unsigned int)&ts;//&ts是个地址,在32位机器上是32位
                                       //这里的转换是安全的,但64位是地址是64位,int是32位
                                       //的,所以会发生截断。
    //long l = (long)ts;//error,无法将自定义的类型(TS)转为基本类型(long)
    //ts = (struct TS)1;//error,无法将基本类型转为自定义类型,编译器直接报错;

    printf("s = %x
", s); //1122
    printf("c = %x
", c); //22
    printf("i = %x
", i); //1122
    printf("j = %x
", j); //3
    printf("p = %x
", p); //p等于ts的地址!
    printf("&ts = %p
", &ts);//%p显示为指针,ts的地址

    return 0;
}

3. 隐式类型转换

(1)隐式类型的转换——编译器主动进行的类型转换

  char c = 0; //变量c占用1个字节

  short s = c;  //c到s隐式类型转换

  int i = s;    //s到i隐式类型转换

  long l = i;   //i到l隐式类型转换

▲注意:低类型到高类型的隐式类型转换是安全的,不会产生截断

           高类型到低类型的隐式类型转换是不安全的,导致不正确的结果

(2)隐式类型转换的发生点

  ①算术运算式中,低类型转换为高类型

  ②赋值表达式中,表达式的值转换为左边变量的类型

  ③函数调用时,实参转换为形参的类型

  ④函数返回值,return表达式转换为返回值类型

 

【编程实例】隐式类型转换分析

#include <stdio.h>

int main()
{
    char c = 'a'; //c=97;
    int i = c;//safe
    unsigned int j = 0x11223344;
    short s = j; //unsafe
 
    printf("c = %c
", c); //c=97
    printf("i = %d
", i); //97
    printf("j = %x
", j); //11223344
    printf("s = %x
", s); //3344
    printf("sizeof(c+s) = %d
", sizeof(c+s)); //c和s同时转为int型,输出4

    return 0;
}

4. 小结

(1)强制类型转换由程序员负责完成

  ①转换可能产生截断;

  ②转换不区分类型的高低

  ③转换不成功时,编译器给出错误信息

(2)隐式类型转换由编译器自动完成

  ①低类型向高类型的转换是安全的

  ②高类型向低类型的转换是不安全的

  ★标准C编译器的类型检查是比较宽松的,因此隐式类型转换可能带来意外的错误

原文地址:https://www.cnblogs.com/5iedu/p/5313646.html