1

float として逆参照したい符号なしバイト配列で受け取った値があります。ptr を 0,0,0xCD,0x42 の 4 つの値のバイト配列を指す uint8_t* とします (これはリトルエンディアン システムです)。

float val = *(float*)ptr;

return -1.34e8

入力すると:

*(float*)ptr;

コードのそのセクションでブレークポイントをヒットした後の式ウィンドウでは、期待どおりに 102.5 が表示されます。さらに、私が入力すると:

*(float*)(ptr - 1);

コンパイラが入力したものの代わりに ptr - 1 を使用したかのように、間違った -1.34e8 が返されます。

私は混乱しています - ここで何か不足していますか?

4

2 に答える 2

3

基本的に deref は正しいです。

printf("%p", ptr);4 バイト アラインされていない (または少なくとも 2 バイト アラインされている) アドレスを取得した場合はどうなりますか? これは、一部のプラットフォームで必要になる場合があります。

テストの場合、uint8_t* に実際の float の値を渡すだけです。

float f= 102.5; 
yourfunct((uint8_t*)&f); 

それが機能するかどうかを確認します。

于 2013-06-11T20:07:36.830 に答える
0
*(float*)(ptr - 1); 

これと同じです

ptr--; //move the pointer to point to charackter in front of the previous one
*(float*)ptr;

これはあなたの意図ですか?それとも、ptr であると指摘されている値から 1 を減算したいだけですか。

于 2013-06-11T19:25:01.720 に答える