1

我想将单精度浮点数编译为闪存0xFFFFFFFF(未初始化闪存)。

当我尝试时,它会在编译过程中(FLOAT32) ((UINT32) 0xFFFFFFFF)转换为浮点而不是.(0x0000804F)0xFFFFFFFF

这适用于文件范围内结构中字段的初始化。当我想到它时,这意味着编译器需要一个 FLOAT32 文字。

我开始怀疑这是否真的可能。

[编辑:这适用于文件范围内结构中字段的初始化]

4

4 回答 4

5

在 C 中,最好的方法是使用union. 存储到UINT32字段中,然后从字段中读出float

在此处完成讨论:如何将浮点数转换或转换为其位序列,例如长

此外,如果您有可用的 C99 功能,则可以使用指定的初始化程序来指定要分配的联合字段。即使您没有 C99,您也可以确保 中的UINT32字段union是第一个字段,因此默认情况下会分配它。 http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

于 2013-12-13T08:33:30.837 回答
2

正如您在评论中要求的那样:在非块范围内(您可以设置全局或文件范围):

#include <inttypes.h>
#include <stdio.h>
typedef union {
    uint32_t uint32;
    float f;
} aliasing;
aliasing a = { 0xffffffff };
int main(){
    printf("%u %f\n", a.uint32, a.f); // output: 4294967295 -1.#QNAN0
    return 0;
}

此外,如果您希望它在结构中(您的原始问题)并且仍然需要静态初始化,您可以执行以下操作:

#include <inttypes.h>
#include <stdio.h>
typedef union {
    uint32_t uint32;
    float f;
} aliasing;
typedef struct {
    aliasing a;
    int otherstuff;
} thestruct_t;
thestruct_t thestruct = { { 0xffffffff }, 0 };
int main(){
    printf("%u %f\n", thestruct.a.uint32, thestruct.a.f); 
         // output: 4294967295 -1.#QNAN0
    return 0;
}
于 2013-12-13T09:27:20.523 回答
1

我认为使用联合然后将任何类型转换为它会起作用:

typedef union _DATA {
    UINT32 AsInteger;
    FLOAT AsFloat;
} DATA;

char* Buffer = malloc(...);
ReadFromFile(Buffer, 1000);

// Casting
// ((DATA*) (Buffer + Offset))->AsFloat
// ((DATA*) (Buffer + Offset))->AsInteger

或静态的

DATA MyData;
MyData.AsInteger = 0xffffffff;

// C99
DATA MyData = {.AsInteger = 0xffffffff};

// C
DATA MyData = {0xffffffff};
于 2013-12-13T09:01:03.687 回答
0

一种解决方案可能是使用绝对放置。使用您的工具可能会也可能不会。

注意:我从来没有这样做过,这里的语法在任何编译器上都可能无效。这只是意图的一个例子。

UINT32 const i = 0xFFFFFFFF @ 0x12345678; /* Place i at address 0x12345678 */
extern FLASH32 const f @ 0x12345678;  /* Pretend that f is at the same address */
于 2013-12-13T08:53:16.890 回答