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

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

cpp 复制代码
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,例如将字节写入文件,再读回内存。

cpp 复制代码
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随意转换 ,可能是有损的转换,级别较低,不出现编译错误,问题不容易被发现。

cpp 复制代码
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是库函数,库函数比语言功能容易支持。

相关推荐
charlie1145141912 天前
C++ STL CookBook
开发语言·c++·stl·c++20
zhangzhangkeji6 天前
<mutex>注释 11:重新思考与猜测、补充锁的睡眠与唤醒机制,结合 linux0.11 操作系统代码的辅助(上)
c++20·stl 库
charlie11451419111 天前
C++ STL Cookbook STL算法
c++·算法·stl·c++20
barbyQAQ15 天前
C++20协程——最简单的协程
c++20
CHANG_THE_WORLD16 天前
现代C++20 variant
java·前端·c++20
baiyu3323 天前
C++20: 像Python一样split字符串
c++·python·c++20
baiyu3324 天前
C++20: 像Python一样逐行读取文本文件并支持切片操作
python·c++20·切片
程序猿阿伟1 个月前
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
c++20
羊小猪~~1 个月前
C/C++语言基础--initializer_list表达式、tuple元组、pair对组简介
c语言·开发语言·c++·vscode·list·c++20·visual studio
lexusv8ls600h1 个月前
探索 C++20:C++ 的新纪元
c++·c++20