读取存储在双精度体中的8字节字段中的4个字节
Read 4 bytes of 8 byte field stored in a double
我有两个。
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];
相关文章:
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 为什么 bool 和 _Bool 如果它们在内存中占用 1 个字节,它们只能存储 0 或 1
- 如何在 XML 中正确存储原始字节数据并恢复它?
- 哪些值存储在对齐的结构/类对象的填充字节中
- 如何使用连接器 c++ 在 mySQL 表二进制(16) 字段中存储 c++ 字节数组?
- 使用字节向量作为其他类型的原始存储是一种好的做法吗
- 将十六进制字符数组存储在字节数组中,而无需更改为 ASCII 或其他任何东西
- 比较存储在 std::string 中的数据中的字节数
- 是否值得使用位移在单个字节中存储多个小数据成员?
- 为什么当我使用双精度时,Qt<->Matlab 正确写入和读取我的字节,但存储 uint32 的字节不正确?
- 一个对象什么时候可以有非零大小的一个,但不能同时具有一个或多个字节的存储
- C++如何从文件中读取十六进制字节并将其存储为指针
- 我如何将整数转换为存储在字符阵列中的十六进制字节
- 将Protobuf字节类型存储在二进制文件中
- 您可以在Arduino字符串中存储多少字节?
- 如何将浮子值的字节存储在字符串中并以后检索值
- 现代x86硬件可以不将单个字节存储到内存中吗
- 在字节的一部分中存储整数的最快方法
- 如何将 BYTE 数组中的两个字节存储为 int(或类似的东西)
- 将字节[4]存储在int中