我想将单个精度浮点数编译为flash 0xFFFFFFFF
(单位化闪存)。
当我尝试(FLOAT32) ((UINT32) 0xFFFFFFFF)
时,它会在编译过程中转换为浮点(0x0000804F)
,而不是0xFFFFFFFF
。
这适用于文件范围中结构中字段的初始化。当我想到它时,这意味着编译器期望FLOAT32文字。
我开始怀疑这是否真的可能。
[编辑:这适用于文件范围中结构中字段的初始化]
答案 0 :(得分:5)
在C中,最好的方法是使用union
。存储到UINT32
字段,然后从float
字段中读出。
在此完成讨论:How to convert or cast a float into its bit sequence such as a long
此外,如果您有可用的C99功能,则可以使用指定的初始值设定项来指定要分配的联合字段。即使您没有C99,也可以确保UINT32
中的union
字段是第一个,因此默认情况下会分配它。 http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
答案 1 :(得分: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;
}
答案 2 :(得分: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};
答案 3 :(得分:0)
一种解决方案可能是使用绝对位置。您的工具可能有也可能无法实现。
注意:我从未这样做过,这里的语法甚至可能在任何编译器上都无效。这只是意图的一个例子。
UINT32 const i = 0xFFFFFFFF @ 0x12345678; /* Place i at address 0x12345678 */
extern FLASH32 const f @ 0x12345678; /* Pretend that f is at the same address */