什么是将下面的结构转换为
uint64_t
的正确方法?struct Data
{
uint64_t sign : 1;
uint64_t exp : 4;
uint64_t man : 8;
};
static_assert(sizeof(Data) == sizeof(uint64_t));
显而易见的是
Data data;
uint64_t n = *(reinterpret_cast<const uint64_t*>(&data));
但它不会被编译为 constexpr
并在 GCC 中产生以下警告:
dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
编辑1:
uint64_t
的结果值可能因不同编译器而异。但当我从 uint64_t
转换回数据结构时,数据结构的值应该是相同的。
因此,更准确地说,我需要:
Data data;
uint64_t n = convert(data);
Data data2 = convert_back(n);
static_assert(data == data2);
int
->uint
。这是一个笔误。 - Dmitrianosizeof(Data)
不可能为2,必须为8,因为底层类型为64位,只赋值了13位含义。 - Remy Lebeau