将((DWORD)0xFFFFFFFF)转换为单精度浮点数而不更改二进制值

时间:2013-12-13 08:26:24

标签: c casting rom

我想将单个精度浮点数编译为flash 0xFFFFFFFF(单位化闪存)。

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

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

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

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

4 个答案:

答案 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 */