0

ホスト PC と組み込みプロセッサの間でシリアル通信を行っています。組み込み側では、浮動小数点データと整数データの文字列を解析する必要があります。私が現在行っていることは、これらの行に沿ったものです:

inline float32* fp_unpack(float32* dest, volatile char* str) {
    Uint32 temp = (Uint32)str[3]<<24;
    temp |= (Uint32)str[2]<<16;
    temp |= (Uint32)str[1]<<8;
    temp |= (Uint32)str[0];
    temp = (float32)temp;
    *dest = (float32)temp;

    return dest;
}

str には 4 つの文字があり、それぞれが float のバイトを表します。string 内のバイトはリトル エンディアンで並べられています。

例として、str から数値 100.0 を抽出しようとしています。string の内容は次のとおりであることを確認しました。

s[0]: 0x00、s[1]: 0x00、s[2]: 0x20、s[3]: 0x41、

これは、100.0 の 32 ビット浮動小数点表現です。さらに、関数が正常に temp を 0x41200000 に設定することを確認しました。ただし、dest は 0x4e824000 になります。問題が次の行から発生することはわかっています: *dest = (float32)temp という行で、temp から dest にビットを単純にコピーし、型キャストを使用してコンパイラを満足させることを望んでいました。

ただし、操作: float x = (float)4/3 は実際には 4 を 4.0 に変換するため、つまりビットを変更するため、これは当てはまらないことに気付きました。

temp のビットを dest に強制するにはどうすればよいですか?

前もって感謝します

編集:整数としての0x4120000は1092616192であり、浮動小数点数としては0x4e82400であることに注意してください

4

4 に答える 4

5

ポインタをキャストする必要があります。値をキャストすると、単純に int が float に変換されます。試す:

*dest = *((float32*)&temp);
于 2011-06-08T15:25:14.330 に答える
4

エイリアシング規則違反による未定義の動作を呼び出さない移植可能な方法:

float f;
uint32_t i;
memcpy(&f, &i, sizeof f);
于 2011-06-08T16:51:11.160 に答える
3

もう1つの解決策があります:

union test {
     float f;
     unsigned int i;
} x;

float flt = 100.0;
unsigned int uint;

x.f = flt;
uint = x.i;

unitの場合と同じビットパターンになりましたf

于 2011-06-08T16:06:16.553 に答える
0

float 100.0 の Hex (IEEE754) 表現ではありません -->0x42c80000

于 2011-06-15T17:31:56.770 に答える