C 在不更改二进制值的情况下将((DWORD)0xFFFFFFFF)转换为单精度浮点
我想将一个单精度浮点编译成flash,格式为C 在不更改二进制值的情况下将((DWORD)0xFFFFFFFF)转换为单精度浮点,c,casting,rom,C,Casting,Rom,我想将一个单精度浮点编译成flash,格式为0xffffff(统一化flash) 当我尝试(FLOAT32)((UINT32)0xffffff)时,它会在编译过程中转换为浮点(0x0000804F),而不是0xffffff 这适用于文件范围内结构中字段的初始化。当我想到它时,这意味着编译器需要一个FLOAT32文本 我开始怀疑这是否真的可能 [编辑:这适用于初始化文件范围中的结构中的字段]在C中,最好的方法是使用联合。存储到UINT32字段中,然后从float字段中读取 在此完成讨论: 此外,如
0xffffff
(统一化flash)
当我尝试(FLOAT32)((UINT32)0xffffff)
时,它会在编译过程中转换为浮点(0x0000804F)
,而不是0xffffff
这适用于文件范围内结构中字段的初始化。当我想到它时,这意味着编译器需要一个FLOAT32文本
我开始怀疑这是否真的可能
[编辑:这适用于初始化文件范围中的结构中的字段]在C中,最好的方法是使用
联合。存储到UINT32
字段中,然后从float
字段中读取
在此完成讨论:
此外,如果有C99功能可用,则可以使用指定的初始值设定项指定要指定的联合字段。即使您没有C99,也可以确保union
中的UINT32
字段是第一个字段,因此默认情况下会分配它 在C语言中,最好的方法是使用联合体。存储到UINT32
字段中,然后从float
字段中读取
在此完成讨论:
此外,如果有C99功能可用,则可以使用指定的初始值设定项指定要指定的联合字段。即使您没有C99,也可以确保union
中的UINT32
字段是第一个字段,因此默认情况下会分配它 一种解决方案可能是使用绝对位置。使用您的工具可能实现,也可能不实现
注意:我从来没有这样做过,这里的语法在任何编译器上都可能无效。这只是意图的一个例子
UINT32 const i = 0xFFFFFFFF @ 0x12345678; /* Place i at address 0x12345678 */
extern FLASH32 const f @ 0x12345678; /* Pretend that f is at the same address */
一种解决方案可能是使用绝对位置。使用您的工具可能实现,也可能不实现
注意:我从来没有这样做过,这里的语法在任何编译器上都可能无效。这只是意图的一个例子
UINT32 const i = 0xFFFFFFFF @ 0x12345678; /* Place i at address 0x12345678 */
extern FLASH32 const f @ 0x12345678; /* Pretend that f is at the same address */
我认为使用联合,然后对其进行任何类型的强制转换都是可行的:
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};
我认为使用联合,然后对其进行任何类型的强制转换都是可行的:
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};
根据您在注释中的要求:此处为非块范围(您可以设置全局范围或文件范围):
#包括
#包括
typedef联合{
uint32\u t uint32;
浮动f;
}混叠;
别名a={0xffffffff};
int main(){
printf(“%u%f\n”,a.uint32,a.f);//输出:4294967295-1。#QNAN0
返回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联合{
uint32\u t uint32;
浮动f;
}混叠;
类型定义结构{
给a取别名;
其他东西;
}结构;
结构=结构{{0xffffffff},0};
int main(){
printf(“%u%f\n”,结构a.uint32,结构a.f);
//输出:4294967295-1.#QNAN0
返回0;
}
根据您在注释中的要求:此处为非块范围(您可以设置全局范围或文件范围):
#包括
#包括
typedef联合{
uint32\u t uint32;
浮动f;
}混叠;
别名a={0xffffffff};
int main(){
printf(“%u%f\n”,a.uint32,a.f);//输出:4294967295-1。#QNAN0
返回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联合{
uint32\u t uint32;
浮动f;
}混叠;
类型定义结构{
给a取别名;
其他东西;
}结构;
结构=结构{{0xffffffff},0};
int main(){
printf(“%u%f\n”,结构a.uint32,结构a.f);
//输出:4294967295-1.#QNAN0
返回0;
}
谢谢。很好的建议和链接。不幸的是,这只适用于块范围,而不适用于文件范围(我需要使用)。@ChristianMadsen,这改变了一切。我添加了一个答案。ChristianMadsen为什么您认为这在文件范围内不起作用@eznme给出了一个代码示例,该示例准确地展示了如何在文件范围内使用该函数进行静态初始化。@bkausbk给出了两个示例,一个显示C99指定的初始值设定项功能,另一个显示纯C。很好的建议和链接。不幸的是,这只适用于块范围,而不适用于文件范围(我需要使用)。@ChristianMadsen,这改变了一切。我添加了一个答案。ChristianMadsen为什么您认为这在文件范围内不起作用@eznme给出了一个代码示例,说明了如何在文件范围内使用它进行静态初始化。@bkausbk给出了两个示例,一个显示C99指定的初始值设定项功能,另一个显示纯C。不要使用以下划线开头的标识符,如\u DATA
;很容易侵入实现名称空间并导致未定义的行为。尤其是后跟大写字母时。不要使用以下划线开头的标识符,如\u DATA
;很容易侵入实现名称空间并导致未定义的行为。特别是当后跟大写字母时。我想您需要printf(“%”PRIu32“%f\n”,a.uint32,a.f)
的sizeof(unsigned)可能是2。我必须指出,我无法更改结构类型的定义。我只允许更改字段的值。比如:typedef struct{float myfloat;}结构;结构=结构{{0xffffffff},0};我想您需要printf(“%”PRIu32“%f\n”,a.uint32,a.f)
的sizeof(unsigned)可能是2。我必须指出,我无法更改结构类型的定义。我只允许更改字段的值。比如:typedef struct{float myfloat;}结构;结构=结构{{0xffffffff},0};