' C' - 如何使用32位浮点值初始化32位整数值?

时间:2016-05-11 08:00:56

标签: c casting

我试图找到一个通用的方法来初始化带有参数值的数组或结构。当从数组或结构中消耗参数时,我的函数将知道上下文,因此它将知道如何正确使用这些值。

要初始化数组/结构,我想做这样的事情:

const void *para[] = {  // General Purpose store for parameters
    "1234",             // Store string pointer
    (void *)1234,       // Store integer value
    (void *)12.34f,     // Store float value
};

字符串和整数参数类型都可以。 float不起作用,因为编译器没有将float转换为void指针的方法。

我需要的是一种将浮点值转换为二进制表示的方法,因此可以将其视为32位无符号整数。可以这样做吗?

我可以用memcpy()的强力解决这个问题,但这需要' const'即将被删除。最终目标是将代码移植到具有有限SRAM的嵌入式ARM系统,因此阵列/结构需要位于ROM中,因此需要由编译器初始化,而不是在运行时。

2 个答案:

答案 0 :(得分:4)

使用结构而不是数组。

struct s_para { const char* a; int b; float c; } const para 
    = { "1234", 1234, 12.34f };

无需施放任何东西。

答案 1 :(得分:1)

您的通用数据数组包含void指针。指向未定义数据类型的指针。在许多系统上,指向大多数数据类型的指针的大小不会变化,因此它指向的内容并不重要。这只有在进行指针算术或访问内容时才会变得相关。你可能知道这一点。正如你所说的那样,你的代码后来就会知道"在什么上下文中使用哪个指针。到现在为止还挺好。我们假设我们有一个32位系统,因为它匹配您的数据类型。

现在你的类型:

  • 字符串" 1234"在编译期间,ist存储在文本部分中。并且您的编译器使用指向该内存部分的指针填充数据数组。
  • 使用整数显式地将1234转换为void指针,告诉编译器:"嘿,这是指针,而不是整数"。只要您的整数和指针具有相同的长度或指针更大,这就可以工作。所以在我们的32位上它还可以。因此,您可以将值直接存储在通常存储指针的字段中。
  • 使用浮动,上面的机制不起作用。 float永远不能被解释为内存地址,因此编译器会失败。

两种选择: 首先,将int和float存储在text / constant部分中,然后将指针放在我的数组中。但是我们必须预先存储这些值...(或者可能有一个花哨的技巧)。这适用于任何类型!:

static int v1 = 1234;
static float v2 = 12.34f;

const void *para[] = {  // General Purpose store for parameters
    "1234",             // Store string pointer
    &v1,                // Store integer value
    &v2,                // Store float value
};

第二,我喜欢的方式是使用联盟。

union data_storage {
     const int t_int;
     const float t_float;
     const char *t_string;
};

const union data_storage params[] = {  // General Purpose store for parameters
    {.t_string = "1234"},           // Store string pointer
    {.t_int = 1234},                // Store integer value
    {.t_float = 12.34f},            // Store float value
};

我用

测试了它
fprintf(stdout, "%s\n%i\n%f\n", params[0].t_string, params[1].t_int, params[2].t_float);