2012-04-30 27 views
0

私が知る限り、Cプログラミング言語では、配列は要素ごとにメモリ要素に格納されます。 (すなわち、要素0、要素1、要素2、...、要素n)。私は次のコードでそれを見ようとしています:符号なし文字配列を整数に変換する

unsigned char a[] = { '\1' , '\2', '\3' ,'\4' }; 
printf("%d\n", (int*) a); 

unsigned charは1バイトで整数は4バイトです。私はそれが値を出力しなければならないと考えられ:= 16909060

00000001 00000010 00000011 00000100 = 2^2 + 2^8 + 2^9 + 2^17 + 2^24

しかし、場合このプログラムを実行すると、試行ごとに異なる結果が生成されます。

私はここで何が欠けていますか?

+0

ほとんどのコンピュータでは、バイトオーダーは想定していたものとは逆です。 –

+0

関連:http://stackoverflow.com/q/29969049/694576 – alk

答えて

4

おそらく*(int *)aを使用します。それ以外の場合は、アドレスを印刷するだけです。

しかし、これは実装定義の振る舞いを呼び出します:

  • あなたのプラットフォームのendiannessに応じて、異なる結果を得ることができます。
  • プラットフォームによっては、charアレイがintとして読み取られるように正しく配置されていない可能性があります。あなたは厳しいエイリアシングルールとして知られているもの壊している -
  • コンパイラは、int *を通じてchar配列を読んだことがないだろう仮定に基づいて、ファンキーな最適化を行うことができます。
+0

また、このボックスのエンディアンによって出力内容が異なります。 –

+1

Re:エンディアンに応じて2つの異なる結果のいずれかが表示されます。 2つだけではありません。まだいくつかのエンディアンが混在しています。たとえば、0x2143または0x3412。 –

+0

@David:公正なポイント;それに応じて適応される言葉遣い! –

関連する問題