gpt4 book ai didi

c++ - static_cast 可以用于位字段吗?

转载 作者:行者123 更新时间:2023-11-27 22:42:18 24 4
gpt4 key购买 nike

您好,静态转换是否适用于位域?因为我在这里创建了一个 32 位 Long 数据的位字段,并且我试图将其转换为 u32。

void CO2_SpiDriver::CreateBuffer() {
//#[ operation CreateBuffer()
typedef struct scr_t
{
union {
u32 data;
struct {
u8 CRC : 4;
u16 Datatosend : 16;
u8 DataLengthCode : 2;
u8 AddressReg : 4;
u8 ReadandWrite : 1;
u8 InstrucCode : 3;
u8 ExtChipId : 2;
};
};
} scr_t;

//set of data bits
scr_t se;
se.CRC = 0x00; //CRC BITS 0 to 3
se.Datatosend = 0x0000000000000000; //Data bits 19 to 4
se.DataLengthCode = 0x00; //DLC bits 21 and 20
se.AddressReg = 0x00; // SMP580 registers to access 25-22
se.ReadandWrite = 0x01; //Read|Write Reg 26
se.InstrucCode = 0x5; //InstrCode 29-27
se.ExtChipId = 0x2; //ExtChipId 31-30

static_cast<u32>(se)

但在这里我得到一个错误,scr_t 不能转换为 u32。谁能给些建议

最佳答案

在 C++ 中, union 中只有一个字段在任何时候是事件的。重新解释内存布局的唯一可移植方法是使用 std::memcpy:

struct bf {
u8 CRC : 4;
u16 Datatosend : 16;
u8 DataLengthCode : 2;
u8 AddressReg : 4;
u8 ReadandWrite : 1;
u8 InstrucCode : 3;
u8 ExtChipId : 2;
};

bf se;
se.CRC = 0x00; //CRC BITS 0 to 3
se.Datatosend = 0x0000000000000000; //Data bits 19 to 4
se.DataLengthCode = 0x00; //DLC bits 21 and 20
se.AddressReg = 0x00; // SMP580 registers to access 25-22
se.ReadandWrite = 0x01; //Read|Write Reg 26
se.InstrucCode = 0x5; //InstrCode 29-27
se.ExtChipId = 0x2; //ExtChipId 31-30

u32 se_as_u32;
static_assert(sizeof(se_as_u32) <= sizeof(se), "UB detector"); // avoid reading buffer overflow (see explanation below)
std::memcpy(&se_as_u32, &se, sizeof(se_as_u32));

注意:我添加了这一行

static_assert(sizeof(se_as_u32) <= sizeof(se), "UB detector");

为了保护 se 在其“边界”之外被读取:

std::memcpy(&se_as_u32, &se, sizeof(se_as_u32));

这从 se 中读取 sizeof(u32)(可能是 4)字节。如果 se 的长度小于 4 个字节,memcpy 将读取“在它之外”,这是一种缓冲区溢出并导致未定义的行为(这是坏的)。如果不考虑不等式 (sizeof(se_as_u32) > sizeof(se)),将调用仁慈的 abort(),程序将立即崩溃可能会工作一段时间并在某一天破坏生产。

关于c++ - static_cast 可以用于位字段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47711930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com