当前位置: 首页 > news >正文

c++20 std::reinterpret_cast、std::bit_cast、std::static_cast

std::reinterpret_cast 类型不相关的转换,不安全例如转为&,不支持,要求sizeof相同

uint32_t n32 = 12345678;//0x00bc614e
uint32_t* ptr = reinterpret_cast<uint32_t*>(n32);//0x00bc614e
uint32_t& ref = reinterpret_cast<uint32_t&>(n32);//0x00bc614e 危险操作
uint32_t n32a = *reinterpret_cast<uint32_t*>(n32);//崩溃,非法内存访问
uint16_t n16 = reinterpret_cast<uint16_t>(n32);;//编译错误error C2440: “reinterpret_cast”: 无法从“uint32_t”转换为“uint16_t”
float f = reinterpret_cast<float>(n);//error C2440: “reinterpret_cast”: 无法从“uint32_t”转换为“float”
}

std::bit_cast 将源对象的位解释为目标对象位,不可转为&,要求sizeof相同无损的转换,用于可复制类型的二进制IO,例如将字节写入文件,再读回内存。

bool b = is_trivially_copyable_v<int&>;//false
float f = 3.14f;//0x4048f5c3
uint32_t n32 = std::bit_cast<uint32_t>(f);//0x4048f5c3
uint32_t n32ref = std::bit_cast<uint32_t&>(f);//编译不通过error C2672: “std::bit_cast”: 未找到匹配的重载函数//is_trivially_copyable_v<int&>;//false
uint16_t n16 = std::bit_cast<uint16_t>(f);//编译不通过error C2672: “std::bit_cast”: 未找到匹配的重载函数//bool_constant<sizeof(_To) == sizeof(_From)>//uint32_t无损转为float
//实现1
uint32_t Value = 0x12345678;
float Tr_Data = *((float*)(&Value));//0x12345678
//实现2
float f = std::bit_cast<float>(0x12345678);//0x12345678

std::static_cast随意转换,可能是有损的转换,级别较低,不出现编译错误,问题不容易被发现。

float f = 33333333.14f;//0x4bfe502b
uint32_t i = static_cast<uint32_t>(f);//0x01fca056
uint32_t n32 = (uint32_t)f;//0x01fca056
uint16_t n16 = (uint16_t)f;//0x0000a056
//static_cast想怎么转都能转成功,可能是有损的转换

reinterpret_cast不能在constexpr中使用,std::bit_cast可以。reinterpret_cast是语言功能,std::bit_cast是库函数,库函数比语言功能容易支持。

http://www.lryc.cn/news/349242.html

相关文章:

  • PHP单独项目启动演示
  • vscode 通过ssh 远程执行ipynb +可以切换conda env
  • ASP.NET银行大厅自助信息系统的开发与实现
  • 学习Vue3中reactive
  • 【Transformer-BEV编码(10)】CVPR2021 PYVA 第一个明确提到 cross-attention decoder可用于视图转BEV
  • nestJs中跨库查询
  • Java编程思想
  • 数组(Java)
  • 接口自动化测试框架搭建
  • (四十二)第 6 章 树和二叉树(树的二叉链表(孩子-兄弟)存储)
  • 测试萌新Python学习(五)接口自动化测试requests
  • Python 机器学习 基础 之 监督学习 [朴素贝叶斯分类器] / [决策树] 算法 的简单说明 / [graphviz] 绘制决策树
  • QT日志类SimpleQtLogger的简单记录
  • 设计模式:观察者模式
  • ICode国际青少年编程竞赛- Python-5级训练场-带参数函数
  • 运维别卷系列 - 云原生监控平台 之 02.prometheus exporter 实践
  • OSPF基本配置
  • HIVE大数据平台SQL优化分享
  • JS算法-十大排序算法(上)
  • c++编程(11)——string类的模拟实现
  • Python从0到POC编写--函数
  • 【教程】Linux/Jetson 安装X11VNC同步屏幕内容
  • 【LLM第五篇】名词解释:prompt
  • k8s v1.20二进制部署 部署 CNI 网络组件 部署 Calico
  • 在React中利用Postman测试代码获取数据
  • 嵌入式学习-通用定时器
  • 培训行业有哪些ai工具?
  • 7.STL中string的一些超常用函数 (附习题)
  • GPT搜索鸽了!改升级GPT-4
  • 数字绘画教学实训解决方案