C语言进阶学习1 隐式类型转换和强制类型转换

本博客记录狄泰学院课程的学习
学习交流群:320628659
个人QQ:1367087622
欢迎大家交流学习
本章的学习目标:
学习隐式类型转换和强制类型转换的基本概念.
本意或非本意下使用类型转换时可能会出现的问题.

在C语言是可以进行类型之间的转换且其中存在两种类型转换的方式

  • 强制类型转换
  • 隐式类型转换

强制类型转换

  • 强制类型转换的语法
    • (Type)var_name;
    • (Type)value;

    (想转换的目标类型)变量名或具体数值

  • 强制类型转换的结果
    • 目标的类型能够容纳目标值:结果不变
    • 目标的类型不能容纳目标值:结果产生截断

    注意:1. 结果产生截断还与操作系统的大小端有关.
    2.并不是所有的强制类型转换都能够成功,当不能进行强制类型转换时,编译器会产生错误信息.

补充一个知识高低位,0x12345678 ,其中12为高位,78为低位

从代码上表述强制类型转换

#include <stdio.h>

struct TS
{
    int i;
    int j;
};
struct TS ts;

int main()
{
    short s = 0x1122;
    
    char c = (char)s;    // 0x22,
    // 这里将short转为char,发生强制类型转换的第二种结果,产生了高位截断
    
    int i = (int)s;      // 0x00001122
    // 这里将低类型(容量小)的类型转为高类型,这是安全的,安全指的是数据不会错误也不会丢失,会将高位填充0
    
    int j = (int)3.1415; // 3
    // 这里将浮点数值转为整数类型,会发生第二种结果,将小数点后的所有数剔除
    unsigned int p = (unsigned int)&ts;
    //这里是将ts数据结构类型取其地址值,然后转为无符号的int,这种情况32位正常 64位截断,32位情况下地址值是4个字节的,而64位下地址值是8个字节的
    
    long l = (long)ts;   // error 
    //在C语言中不能将自定义类型转换为基本数据类型
    
    ts = (struct TS)l;   // error 
    //同理,也不能将基本数据类型转换为自定义类型
    
    printf("s = %x\n", s);
    printf("c = %x\n", c);
    printf("i = %x\n", i);
    printf("j = %x\n", j);
    printf("p = %x\n", p);
    printf("&ts = %p\n", &ts);
    
    return 0;
}

隐式类型转换

  • 编译器主动进行的类型转换

编译器的好意也可能办坏事,这种默默做的事是因为程序员不熟悉隐式转换规则而造成.

char c =0;
short s = c;
int i = s;
long l = i;

低类型高类型的隐式类型转换是安全的,不会发生截断。
高类型低类型的隐式类型转换是不安全的,会发生截断产生不正确的结果。

  • 什么情况下发生隐式类型转换呢
    • 算术运算中,低类型转换为高类型
    • 赋值表达式中,赋值符“=”右边的变量值转换为左边变量的类型
    • 函数调用时,实参转换为形参的类型
    • 函数返回时,函数返回值,ruturn表达式转换为返回值类型

安全的隐式类型转换,反之则会发生错误。
安全的隐式转换

猜你喜欢

转载自blog.csdn.net/qq_33416447/article/details/85529254