【C/C++】类型转换

2023-11-16


在这里插入图片描述

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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C/C++】类型转换 的相关文章

  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没
  • 当我使用 OpenSSL1.1.0g 根据固定的 p 和 g 值创建 Diffie Hellman 密钥协议密钥时,应该执行哪些检查?

    您好 我尝试通过这段代码使用修复 p 和 g 参数来制作 Diffie Hellman Keysanswer https stackoverflow com a 54538811 4706711 include

随机推荐

  • 为什么String要被设置为不可变类?百日百题(2/100)

    问题引入 我们学习了String的数据类型 知道了String类型一旦生成就不会再发生改变 这就是他的不可变性 也就意味着每次修改都会产生一个新的String变量 对性能影响较大 StringBuilder和StringBuffer产生的对
  • [Hyperf]源码阅读:验证器验证规则

    hyperf validation src Concerns ValidatesAttributes php
  • 单向链表的Java实现,以及相关函数。

    如上图所示就是单向链表的示意图 下面就是Java实现单向链表的基本过程与源码 可以跑起来的 1 创建一个节点类 package com wpl snglelink public class Node public Object getDat
  • c++_函数返回值,引用&作为函数返回值

    catalog 函数返回值 返回值是 const T 返回值的类型是 T 返回的对象是 局部对象 实现原理 返回的对象是 全局对象 实例 函数返回值 返回值是 const T ST operator ST a ST b return ST
  • 每日一题——求解连通分量个数

    题目描述 从键盘接收图的顶点集 关系集 创建无向图 第一行依次输入图的顶点个数n 关系个数k 以空格隔开 顶点个数 lt 20 第二行依次输入顶点值 类型为字符 接下去有k行 每行为两个字符 u 和 v 表示节点u 和 v 连通 格式为 u
  • 麦克输入

    如图所示 单端输入只有一个输入引脚ADCIN 使用公共地GND作为电路的返回端 ADC的采样值 ADCIN电压 GND的电压 0V 这种输入方式优点就是简单 缺点是如果vin受到干扰 由于GND电位始终是0V 所以最终ADC的采样值也会随着
  • Ros noetic 机器人坐标记录运动路径和发布 实战教程(B)

    前言 网上记录Path的写入文件看了一下还挺多的 有用yaml作为载体文件 也有用csv文件的路径信息 也有用txt来记录当前生成的路径信息 载体不重要 反正都是记录的方式 本文主要按yaml的方式写入 本文将撰写csv方式的文件写入格式
  • mysql查询每年每个月的数据_mysql 查询一年中每个月份的数据量

    这个是用mid 函数 截取字符串 mysql gt select count as 数量 mid time 1 7 as month from my add where time between 2015 01 01 00 00 00 an
  • 华为OD机试真题-字符串解密 【2023.Q1】

    题目内容 题目描述 有两个字符串string1和string2 string1是一个被加扰的字符串 小写英文字母 a z 和数字字符 0 9 组成 而加扰字符串由 0 9 a f 组成 string1里面可能包含0个或多个加扰子串 剩下可能
  • Dell服务器IDRAC管理界面配置NTP时间同步

    登录idrac管理界面 1 点击 iDRAC设置 2 在属性里面点击 设置 3 时区和NTP 4 在NTP1这项填写NTP的服务器地址5 右下角点击 应用 过几分钟就生效了
  • 回归指令_SWAP字节交换指令详解

    说明 本篇文章是为下一篇文章 在触摸屏上演示7段数码管指令而预先讲解的一个指令 正文 字节交换指令应该算一个比较重要的指令 特别PLC要和一些HMI设备通讯 在HMI上录入数据的时候 就有可能需要经常使用这个指令 来看一下西门子200PLC
  • 基于二叉树的算术表达式计算与实现

    非常有趣的一道题 代码参考 https blog csdn net over786 article details 17395567 把一个正常的表达式写成这个样子咯 问题的难点在于整数有多位 而且你要判断好哪个符号作为根 比如5 3 4
  • 华为OD机试 Python 限载货物数最小值

    描述 在火车站旁的货运站 小明负责调度2K辆中转车 其中K辆用于干货 K辆用于湿货 每批到站的货物来自不同的供货商 需要按照顺序装入中转车 注意 一个供货商的货物只能装在一辆车上 不能分开 但是 一辆车可以放多个供货商的货物 问题是 要让所
  • 检测洛达芯片的软件_洛达1562A与1536u与杰里有哪些区别?购买前10条须知

    相信大家应该对AirPodspro已经不陌生了 那么对于廉价版本的华强北AirPodspro有多少了解呢 芯片 洛达 中科蓝讯 杰里 恒炫 惴昱 等等 壳料 彩创壳 原厂彩创壳 资江壳 高美特壳料等等 喇叭也有好多种喇叭 至于大家为什么在各
  • (牛客网)华为机试(二)

    牛客网 华为机试题集解答 在解题前先分享一波oj刷题的固定格式代码 方便输入时使用 import java util import java io public class Main 一定要使用Main作为类名 public static
  • CODIS原理 之 数据迁移流程[2.X]

    CODIS原理 之 数据迁移流程 2 X 分类 源码剖析设计思路 1173 0 作者 邹祁峰 邮箱 Qifeng zou job hotmail com 博客 http blog csdn net qifengzou 日期 2016 08
  • 云安全架构的设计

    公有云安全概述 云安全职责划分 共同担责 软件即服务SAAS 云服务厂家几乎负责所有的安全性 因为租户只能访问 管理和使用其提供的应用程序 但无法对应用程序做破坏性操作 例如 SAAS服务厂家提供安全 日志 运维 审计 应用安全性检测等 二
  • 物联网开发124 - Micropython ESP32 C3连接AHT20温湿度传感器和BMP280压力传感器模块

    一 目的 这一节我们来学习如何使用合宙ESP32 C3 连接AHT20温湿传感器模块和BMP280压力传感器模块 使用ST7735屏幕进行显示 下面我们一起来学习一下吧 二 环境 ESP32 C3开发板 MicroPython v1 19
  • Android attr6,android – 未找到样式属性attr / colorSecondary

    我无法建立我的项目 它显示我attr colorSecondary未找到错误 看看我的风格和清单 请告诉我什么是错的 Android studio version 3 0 canary 9 compileSdkVersion 25 buil
  • 【C/C++】类型转换

    文章目录 1 C语言中的类型转换 1 1隐士类型转换 相近类型 意义相近 1 2 强制类型转换 2 C 的类型转换 2 1相近类型转换 static cast 2 2强制类型转换 reinterpret cast 2 3去掉对象const属