[英]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.