32位浮点数转64位uint64_t
Convert 32bit floating-point number to 64bit uint64_t
我有一个 uint64_t
,我想在其中存储一个 float
.
作为最右边的 32 位
基本上,我想要的是给定一个浮点数 f
:
|--------------------------------|--------------------------------|
| 32 bits set to 0 | the 32 bits of our float |
|================================|================================|
^ ^
^ 64-bit unsigned integer ^
|-----------------------------------------------------------------|
我试过转换它 (uint_64t)f
,但结果有点奇怪。
有什么想法吗?
假设您希望 uint64_t
包含浮点数的 表示,您将执行以下操作:
uint32_t t;
memcpy(&t, &f, sizeof(t));
uint64_t val = t;
对 memcpy
的调用将浮点数的表示形式复制到大小相同的 uint32_t
中。然后后面的赋值有效地将 val
的高位字设置为 0,将低位字设置为 32 位值。以这种方式执行,它不依赖于字节顺序。
编辑:虽然我确实证明了下面的评论是正确的,但添加了此编辑以防有人需要调整/随机排列 C 中的字节。
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
int main()
{
// test vars
unsigned int testInt = 1;
char *testChar = (char *)&testInt;
// allocate an 64 bit unsigned integer set all bits to zero
uint64_t i = 0;
// define the float here
float f = 3.14;
printf("64 bits integer val before copy = %"PRId64"\n", i);
printf("32 bits float val before copy = %f\n", f);
if (*testChar == 1) {
// little endian
printf("little endian system\n");
*((float *)&i) = f; // copy float bit pattern to lower bytes
}
else {
// big endian
printf("big endian system\n");
*((float *)&i + 1) = f; // copy float bit pattern to lower bytes
}
printf("64 bits integer val after copy = %"PRId64"\n", i);
return 0;
}
我有一个 uint64_t
,我想在其中存储一个 float
.
基本上,我想要的是给定一个浮点数 f
:
|--------------------------------|--------------------------------|
| 32 bits set to 0 | the 32 bits of our float |
|================================|================================|
^ ^
^ 64-bit unsigned integer ^
|-----------------------------------------------------------------|
我试过转换它 (uint_64t)f
,但结果有点奇怪。
有什么想法吗?
假设您希望 uint64_t
包含浮点数的 表示,您将执行以下操作:
uint32_t t;
memcpy(&t, &f, sizeof(t));
uint64_t val = t;
对 memcpy
的调用将浮点数的表示形式复制到大小相同的 uint32_t
中。然后后面的赋值有效地将 val
的高位字设置为 0,将低位字设置为 32 位值。以这种方式执行,它不依赖于字节顺序。
编辑:虽然我确实证明了下面的评论是正确的,但添加了此编辑以防有人需要调整/随机排列 C 中的字节。
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
int main()
{
// test vars
unsigned int testInt = 1;
char *testChar = (char *)&testInt;
// allocate an 64 bit unsigned integer set all bits to zero
uint64_t i = 0;
// define the float here
float f = 3.14;
printf("64 bits integer val before copy = %"PRId64"\n", i);
printf("32 bits float val before copy = %f\n", f);
if (*testChar == 1) {
// little endian
printf("little endian system\n");
*((float *)&i) = f; // copy float bit pattern to lower bytes
}
else {
// big endian
printf("big endian system\n");
*((float *)&i + 1) = f; // copy float bit pattern to lower bytes
}
printf("64 bits integer val after copy = %"PRId64"\n", i);
return 0;
}