• 第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编译器的类型检查是比较宽松的,因此隐式类型转换可能带来意外的错误

  • 相关阅读:
    python 之路之函数01
    python之路07文件处理
    python 之路06day
    python之路05
    【漏洞预警】方程式又一波大规模 0day 攻击泄漏,微软这次要血崩
    PHP渗透中的奇淫技巧--检查相等时的漏洞
    中国气象局某分院官网漏洞打包(弱口令+SQL注入+padding oracle)
    【原创】实战padding oracle漏洞
    破解神器Hashcat使用简介
    关于void main()的误区
  • 原文地址:https://www.cnblogs.com/5iedu/p/5313646.html
Copyright © 2020-2023  润新知