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