c - 在 C 中使用 #define 获取常量浮点值的原始数据字节

标签 c

我正在尝试从 C 中的常量浮点中检索原始数据字节。这样做是为了创建一个可读的常量字节数组。这可以在下面看到。

    #define FLOAT_TO_BYTES(value) \
        (uint8_t)(value),       (uint8_t)(value << 8), \
        (uint8_t)(value << 16), (uint8_t)(value << 24)

    const uint8_t byteArray[] = {
         FLOAT_TO_BYTES(11.4)
    };

问题是我无法使用指针或任何类型的代码块。我知道上面的方法不起作用,因为你无法移动浮点值。我尝试过使用 union ,但也无法使其发挥作用。任何帮助将不胜感激!

最佳答案

以下是如何使用 union 获取字节:

#include <stdio.h>

union float_bytes{
    float f; 
    char  b[sizeof(float)];
};

int main()
{
    union float_bytes fb = { 1.1 };
    for(int i=0; i<sizeof(float);i++)
        printf("%hhx\n", fb.b[i]);

}

您也可以简单地执行以下操作:

#include <stdio.h>
int main()
{
    float f = 1.1;
    for(int i=0; i<sizeof(float);i++)
        printf("%hhx\n", ((char*)&f)[i]);

}

始终允许通过字符指针检查任何内容。

如果你真的愿意,你可以将 (char*) 的转换放入宏中 并传入一个浮点指针,或者您可以在宏中创建一个临时复合文字以避免显式浮点变量:

#include <stdio.h>

#define FLOAT_BYTES(Float) ((char*)(&(float){Float}))
int main()
{
    for(int i=0; i<sizeof(float);i++)
        printf("%hhx\n", FLOAT_BYTES(1.1)[i]);
}

(复合文字的生命周期是其最近的封闭 block 的生命周期。)

关于c - 在 C 中使用 #define 获取常量浮点值的原始数据字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41862038/

相关文章:

c - 队列排序功能排序到错误的队列

c - (x <= y <=z) ISO C 中的条件语法?

c - 链表,但是每个 "next"指针都指向下一个节点的 "next"指针

任何人都可以报告使用 HWUT 进行单元测试的经验吗?

c - 为什么编译器要向已经 4 字节对齐的结构添加填充?

java - 在 Java 中加密一个字符串,以便 C 程序可以解密它,而解密文本中没有任何填充?

c - 如何访问函数中的结构成员并将其作为 void* 类型?

c - 关于运算符(operator) "+"的问题

c - 如何从一个变量中提取更多值(value)

c - 在openwrt路由器上运行的组播接收器软件无法工作