1

単精度浮動小数点数を0xFFFFFFFF(初期化されたフラッシュとして) フラッシュにコンパイルしたい。

試してみると、コンパイル プロセス中に ではなく(FLOAT32) ((UINT32) 0xFFFFFFFF)浮動小数点に変換されます。(0x0000804F)0xFFFFFFFF

これは、ファイル スコープ内の構造体のフィールドの初期化に適用されます。考えてみると、これはコンパイラが FLOAT32 リテラルを想定していることを意味します。

これが実際に可能かどうか疑問に思い始めています。

[編集: これは、ファイル スコープ内の構造体のフィールドの初期化に適用されます]

4

4 に答える 4

5

C では、a を使用するのが最善の方法ですunion。フィールドに格納し、UINT32フィールドから読み出しfloatます。

ここでの完全な議論: float を long などのビットシーケンスに変換またはキャストする方法

また、C99 機能を利用できる場合は、指定されたイニシャライザを使用して、割り当てる共用体フィールドを指定できます。C99 を持っていなくても、 のフィールドが最初のUINT32フィールドであることを確認するだけでunion、デフォルトで割り当てられます。 http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

于 2013-12-13T08:33:30.837 に答える
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;
}
于 2013-12-13T09:27:20.523 に答える
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};
于 2013-12-13T09:01:03.687 に答える