可以将一个大小为8字节的类转换为uint64_t吗?

时间:2015-08-12 14:19:07

标签: c++ casting explicit-conversion

假设我们有以下代码:

class A {
        uint32_t X;
        uint32_t Y;
};

int main ()
{
    A a;
    uint64_t num  = (uint64_t)a;
}

编译器给出错误:"无法从A转换为uint64_t。没有用户定义转换运算符定义。"

是否预期错误,如果是,为什么?

3 个答案:

答案 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);