質問

私はこのビットのコードで出力を間違えます。

#include <stdio.h>
#include <string.h>

int main() 
{
  unsigned char bytes[4];
  float flt=0;

  bytes[0]=0xde;
  bytes[1]=0xad;
  bytes[2]=0xbe;
  bytes[3]=0xef;

  memcpy( &flt, bytes, 4);

  printf("bytes 0x%x float %e\n", flt, flt);
  return 0;
}

を出力するかを取り付ける際に使用します。

バイト0xc0000000float-2.000001e+00

私は期待し得

バイト0xdeadbeef float-6.2598534e+18

編#1 としていることが指摘されているendiannessが異なる可能性があるためですが、以下の

バイト0xefbeadde float-1.1802469e+29

何かわからないが、キャストからfloat値のunsigned intよ0xc0000000のfloatのprintf書いて-2.0000い属性をコンパイラの最適化)

この作業の前に、異なる。な建築。

役に立ちましたか?

解決

な問題のmemcpy.

  1. float はbgmに変換され double 時が過ぎ ... のprintfのですから4バイトのほとんどのインテル述べた。
  2. きexpacting 0xdeadbeef このコードに関するこの建築はビッグエンディアンです。※多少しエンディアンの建築、インテルx86.

他のヒント

あなたは)フロートはprintfの(のような変数パラメータ関数に渡されたとき倍増に昇格されていることを実現していますか?だから、あなたが言うときます:

printf("bytes 0x%x float %e\n", flt, flt);

あなたが本当に2つの4バイトのような2つの8バイトの値が何であるかを治療しようとしています 値は、(私は信じて)未定義の動作を与えます。

printfの中の "%x" はunsigned int型を期待しています。あなたはそれを自動的に変換し、それはあなたが望むものではありません取得されたフロートを与えています。あなたのような何かをしたい:

printf("bytes 0x%x float %e\n", *((unsigned int *)&flt), flt);
他の誰かが指摘したように、あなたは、x86にしている場合は、

ああ、そして、あなたはより多くの0xefbeaddeのように、0xdeadbeefがを参照してくださいするつもりはない。

これはどんな優れているかどうかを確認します:

printf("bytes 0x%x float %e\n", *(int *)&flt, flt);

二重にフロートから宣言を変更し、パラメータのプロモーションを参照してください。私のマシンでは、印刷物それます:

bytes 0xefbeadde float -1.860545e+230

0xefbeaddeはdeadbeafのためのビッグエンディアンです。フロート後に表示される数は変化するであろうように、二重の最後の4つのバイトは、未定義である。

あなたはそれが別のコンピュータに取り組んで述べた

、それはコンピュータのどのようなものでしたか? )

:はsizeof(float型)==はsizeof(ダブル)小さなエンディアンなってんだろう
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top