我想将单精度浮点数编译为闪存0xFFFFFFFF
(未初始化闪存)。
当我尝试时,它会在编译过程中(FLOAT32) ((UINT32) 0xFFFFFFFF)
转换为浮点而不是.(0x0000804F)
0xFFFFFFFF
这适用于文件范围内结构中字段的初始化。当我想到它时,这意味着编译器需要一个 FLOAT32 文字。
我开始怀疑这是否真的可能。
[编辑:这适用于文件范围内结构中字段的初始化]
在 C 中,最好的方法是使用union
. 存储到UINT32
字段中,然后从字段中读出float
。
在此处完成讨论:如何将浮点数转换或转换为其位序列,例如长
此外,如果您有可用的 C99 功能,则可以使用指定的初始化程序来指定要分配的联合字段。即使您没有 C99,您也可以确保 中的UINT32
字段union
是第一个字段,因此默认情况下会分配它。 http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
正如您在评论中要求的那样:在非块范围内(您可以设置全局或文件范围):
#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;
}
我认为使用联合然后将任何类型转换为它会起作用:
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};
一种解决方案可能是使用绝对放置。使用您的工具可能会也可能不会。
注意:我从来没有这样做过,这里的语法在任何编译器上都可能无效。这只是意图的一个例子。
UINT32 const i = 0xFFFFFFFF @ 0x12345678; /* Place i at address 0x12345678 */
extern FLASH32 const f @ 0x12345678; /* Pretend that f is at the same address */