2016-10-19 25 views
0

何ですか(float*) gの場合に特別に行います。もし私がg = *&i;と書いたら、通常はgut = fであるが、g = *(float*)&i;ならば、なぜg = 0.0000?異なるデータ型へのポインタ型キャスト

g = *&i; 

オペレータ*&が互いに打ち消し合うので、コードがあったかのように結果は:

g = i; 

行ラインで

#include <stdio.h> 

int main() 
{ 

int i = 37; 
int *p; 
p = &i; 
float f = i; 
printf("%d\n", i); 
printf("%d\n", p); 
printf("%d\n", *p); 
float g = *(float*) &i; 
printf("i = %d f = %f g = %f", i, f, g); 
} 

答えて

0

g = *&iは、g = iと同じで、floatにintを代入します。

  1. ロード整数、浮動小数点フォーマットとして2変換、フロート3.店舗:コンパイラは=オペレータを介して変換を行います。丸めの問題の横に大きな効果があります。

その他の構成では、浮動小数点ポインタへの整数ポインタを再解釈します。浮動小数点数(浮動小数点数は一般に仮数部と指数部のビット数をいくつか使用しています)とints(整数はメモリ8ビット×8ビットにシリアル化されています)のデータ形式が異なるため、コンパイラはソースから余分な変換なしで目的地とあなたが望むものを得ることはありません。

+0

"floatポインタへの整数ポインタの再解釈"とは何か "floatへのintの代入"とはどのように違うのですか? –

+1

'int'から' float'への代入は、 'int'値が> = 2 ** 24。 –

+0

詳細を編集しました。 @ウェザーヴェーンは大丈夫です(私は24歳よりも16歳はよく理解しています)。 –

0

float g = *(float*) &i; 

は、int型とfloat型が互換性がないため、未定義の動作を引き起こします。

あなたが見ている結果は、未定義の動作が原因ですが、あなたのケースでは動作は比較的害です。 int型の変数のビットは、float型のように再解釈されます。

ポインタのキャストは、異なるタイプのビットを解釈する正しい方法ではありません。

関連する問題