读取存储在双精度体中的8字节字段中的4个字节

Read 4 bytes of 8 byte field stored in a double

本文关键字:字节 存储 字段 4个 读取 双精度      更新时间:2023-10-16

我有两个。

double d

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

0x0000000012345678

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

float f = *(((float*) &d)) + 1);

获取d的双指针,转换为浮点指针,增加4个字节,解引用。

有更好的方法吗?

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

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;
}

我可能会使用内存,比如:-

memcpy(&f, reinterpret_cast<char*>(&d)+4, sizeof (float));

其中f和d是包含double和float的变量

C代码

@Kerrek SB变奏曲

double d;
float f;
assert(2 * sizeof f == sizeof d);
memcpy(&f, (unsigned char*) &d + sizeof f, sizeof f);
使用工会

double d;
float f;
assert(2 * sizeof f == sizeof d);
union double_float {
  double d;
  float f[2];
} x
x.d = d;
f = x.f[1];