簡體   English   中英

在不更改二進制值的情況下將((DWORD)0xFFFFFFFF)轉換為單精度浮點

[英]Casting ((DWORD) 0xFFFFFFFF) to single precision float without changing binary value

我想將單個精度浮點數編譯為0xFFFFFFFF (統一閃存)。

當我嘗試(FLOAT32) ((UINT32) 0xFFFFFFFF) ,它將在編譯過程中轉換為浮點(0x0000804F)而不是0xFFFFFFFF

這適用於文件作用域中結構中字段的初始化。 當我想到它時,這意味着編譯器期望使用FLOAT32文字。

我開始懷疑這是否真的可能。

[編輯:這適用於文件范圍內結構中字段的初始化]

在C語言中,最好的方法是使用union 存儲到UINT32字段中,然后從float字段中讀出它。

在此完整討論: 如何將浮點數轉換或轉換為它的位序列,例如long

另外,如果您具有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 */

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM