假设我们有以下代码:
class A {
uint32_t X;
uint32_t Y;
};
int main ()
{
A a;
uint64_t num = (uint64_t)a;
}
编译器给出错误:"无法从A转换为uint64_t。没有用户定义转换运算符定义。"
是否预期错误,如果是,为什么?
答案 0 :(得分:3)
您需要将一个值的32位显式复制到64位值的高32位,将其他32位复制到64位值的低32位。
所有其他方法在技术上都是未定义的行为(尽管如果您了解您的实施细节,它们可以正常工作)。
class A
{
uint32_t X;
uint32_t Y;
uint64_t to64()
{
// convert X and Y to unsigned 64-bit ints
uint64_t x64 = X;
uint64_t y64 = Y;
// left-shift the 64-bit X 32 bits
x64 <<= 32;
// return the sum
return( x64 + y64 );
}
};
您可以使用更少的代码完成此操作,但这会逐步显示您需要执行的操作。
答案 1 :(得分:0)
您尚未指定代表的'endianness'。如果您希望x
为高位词,y
为低位词,则可以向您的班级添加强制转换操作符:
explicit operator uint64_t () const noexcept
{
return ((static_cast<uint64_t>(X) << 32) | Y);
}
'(uint64_t) obj'
或(理想情况下)'static_cast<uint64_t>(obj)'
会调用此方法。 explicit
阻止它被隐式调用 - 这可能是我整天说的最蠢的事情 - 但它阻止了surprises。如果您使用<cstdint>
和std::uint64_t
,则需要额外积分。
答案 2 :(得分:-2)
绝对未定义的行为,但请尝试
uint64_t num = *reinterpret_cast<uint64_t *>(&a);