码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【C/C++】类型转换


    文章目录

        • 1.C语言中的类型转换
          • 1.1隐士类型转换【相近类型,意义相近】
          • 1.2.强制类型转换
        • 2.C++的类型转换
          • 2.1相近类型转换--static_cast
          • 2.2强制类型转换---reinterpret_cast
          • 2.3去掉对象const属性---const_cast
          • 2.4dynamic_cast

    在这里插入图片描述

    1.C语言中的类型转换

    在C语言中,如果赋值运算符左右两侧类型不同,或者形参和实参类型不匹配,或者返回值类型和接收返回值类型不一致,就会发生类型转换。

    C语言中的类型转换分为两种:隐式类型转换和强制类型转换

    1.1隐士类型转换【相近类型,意义相近】
    void test()
    {
        int i=1;
        double d=i;
        printf("%f,%f",d,i);
    }
    输出:
        1.00000  0.00000
    解释:
        i按照%f的方式输出时,发生了整形提升。
        浮点数在内存的存储规则为:
        	(-1)^S*M*2^E
        S:一个比特位,表示数的正负
        M:23个比特位,有效数字,科学计数法表示
        E:8个比特位,表示指数位
    

    在这里插入图片描述

    需要注意的是:E在存储到内存的时候,需要加上一个中间数127

    1.2.强制类型转换

    强制类型转换针对的是意义相差很远的类型,比如int类型和指针类型

    void test()
    {
        int i=0;
        int* p=&i;
        int address(int)p;
        printf("%p,%d\n",p,address);
    }
    输出:
        0133FA4C,20183628
    

    2.C++的类型转换

    2.1相近类型转换–static_cast

    static_cast用于相近类型,意义相似的类型。static_cast用于非多态类型的转换(静态转换)。

    void test()
    {
        double d=11.11;
        int a=static_cast<int>(d);
        cout<<a<<endl;
    }
    输出:11
    
    2.2强制类型转换—reinterpret_cast
    void test()
    {
        double d=12.34;
        int a=static_cast<int>(d);
        cout<<a<<endl;
        int*p=reinterpret_cast<int*>(a);
        cout<<p<<endl;
    }
    输出:
        12
    	0000000C
    
    2.3去掉对象const属性—const_cast

    const_cast最常用的用途就是删除变量的const属性,方便赋值

    const int ca=2;
    int*pi=const_cast<int*>(&ca);
    *pi=3;
    cout<<ca<<endl;
    cout<<*pi<<endl;
    输出:
        2 3
    为什么ca输出的是2?
        对于ca,编译器做出了优化,考虑到const类型被修改的可能性很小,所以编译器将ca存放在寄存器中。
      
        
    如果修改为
    volatile const int ca=2;
    int*pi=const_cast<int*>(&ca);
    *pi=3;
    cout<<ca<<endl;
    cout<<*pi<<endl;
    输出:
        3 3
     volatile表示强制从内存中取出变量值
    
    2.4dynamic_cast

    dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)

    • 向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)【多态和切片原理】
    • 向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)

    注意:

    1. dynamic_cast只能用于父类含有虚函数的类

    2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0

    dynamic_cast底层实现使用了虚表的结构

    class A
    {
    public:
    	void f()
    	{}
    };
    class B :public A
    {
    	void f()
    	{}
    };
    void test(A* pa)
    {
    	B* ptr1 = static_cast<B*>(pa);
    	B* ptr2 = dynamic_cast<B*>(pa);
    }
    int main()
    {
    	A a;
    	B b;
    	test(&a);
    	test(&b);
    	return 0;
    }
    

    在这里插入图片描述

    class A
    {
    public:
    	virtual void f()
    	{}
    };
    class B :public A
    {
    	void f()
    	{}
    };
    void test(A* pa)
    {
    	B* ptr1 = static_cast<B*>(pa);
    	B* ptr2 = dynamic_cast<B*>(pa);
    }
    int main()
    {
    	A a;
    	B b;
    	test(&a);
    	test(&b);
    	return 0;
    }
    
  • 相关阅读:
    【暑期每日一题】洛谷 P5740【深基7.例9】最厉害的学生
    七天入门node.js(02)
    SpringMVC(四、异常处理和综合练习)
    顶顶通呼叫中心中间件-限制最大通话时间(mod_cti基于FreeSWITCH)
    【深入浅出Spring原理及实战】「原理分析专题」重新回顾一下Spring框架的异步执行调用的原理和实战
    Nginx
    JavaWeb-Session和Cookie
    OpenJudge NOI 2.1 1816:拨钟问题
    Django中重写model_to_dict方法,兼容接口返回展示时间和外键的
    【postgresql】查询结果添加一个额外的自增编号
  • 原文地址:https://blog.csdn.net/qq_53893431/article/details/127104542
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号