读取存储在double中的4字节8字节字段

aco*_*ier 2 c c++ types pointers

我有一个双.

double d
Run Code Online (Sandbox Code Playgroud)

不幸的是,它实际上包含一个浮点数,最后4个字节.(原因很复杂,无法控制).所以内存看起来像这样.

0x0000000012345678
Run Code Online (Sandbox Code Playgroud)

我需要提取最后4个字节并将它们存储在浮点数中.我尝试了一些不同的东西,但到目前为止我的最好结果是

float f = *(((float*) &d)) + 1);
Run Code Online (Sandbox Code Playgroud)

获取d的双指针,转换为浮点指针,添加4个字节,取消引用.

有没有更好的办法?

Ker*_* SB 6

肯定有一种更便携的方式:

float get(double d)
{
    float result;
    unsigned char * dst = reinterpret_cast<unsigned char *>(&result);
    unsigned char const * src = reinterpret_cast<unsigned char const *>(&d);

    static_assert(sizeof(float) == 4);
    static_assert(sizeof(double) == 8);

    dst[0] = src[4];
    dst[1] = src[5];
    dst[2] = src[6];
    dst[3] = src[7];

    // or use std::memcpy or std::copy

    return result;
}
Run Code Online (Sandbox Code Playgroud)

  • @ikh它尊重[严格别名规则](http://en.cppreference.com/w/cpp/language/reinterpret_cast#Type_aliasing),OP的代码没有. (3认同)
  • @IInspectable:char是特权.例如,俄罗斯的Char可以为任何人添加别名. (2认同)