【问题标题】:How to store generic four bytes that can initialize to either integer or float如何存储可以初始化为整数或浮点数的通用四个字节
【发布时间】:2018-01-26 01:38:35
【问题描述】:

我正在尝试编写一个设置列表,以使 memcpy 就位。这将是一个非常大的列表(100 多个项目),开发人员将花时间进行调整。我希望能够将其中任何一个初始化为 4 字节浮点或 4 字节整数。

我想要什么:

{.settingName="setting 1", .value=0.5f},
{.settingName="setting 2", .value=0.5f},
{.settingName="setting 3", .value=300},

因为开发人员会花时间调整这些值,所以我不能只初始化 0x3f000000 来代替 0.5f

我也无法将其存储为浮点数:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

uint8_t data[sizeof(float)];

int main(){
    float f = 0xFFFFFFFF;
    memcpy(data, &f, sizeof(f));
    for(int i=0; i<sizeof(data); i++){
        printf("%x ", data[sizeof(data)-1-i]);
    }
    uint32_t integer = (uint32_t) f;
    printf("\n%x ", integer);
}

因为这会输出: 4f 80 0 0 整数:0

这在 C 中可能吗?

【问题讨论】:

  • 重要的问题是你为什么想要这个?此问题的答案通常表明您在解决根本问题时采用了不正确的方法。
  • 为什么不用使用联合,然后就用{ .settingName = "setting 1", .value_f = 0.5f }, { .settingName = "setting 3", .value_i = 300 }

标签: c byte


【解决方案1】:

使用一个结构体,其中包含一个联合体和一个指示联合体的哪个成员处于活动状态的标志

typedef struct {
    typedef union {
        int ival;
        float fval;
    } data;
    enum {
        INT,
        FLOAT;
    } which;
} dataContainer;

【讨论】:

  • 有趣,您介意添加一个示例吗? (主要)
【解决方案2】:

使用union,但您需要一种方法来判断该值是整数还是浮点数。

union number {
    int i;
    float f;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多