1

コード:

int main(){
   short a=1;         // #1
   char *p=(char*)&a;
   *(p)=1;            // #2
   cout << a << endl; // Output: 1
   *(p+1)=2;          // #3
   cout << a << endl; // Output: 513
}

私の理解では、出力は下の図の 257 と 258 のようになるはず
です。上記のプログラムを実行したときに異なる結果が得られた理由はありますか?

ここに画像の説明を入力

更新: これは未定義の動作であることはわかっていますが、それでも、これは 10 進数から 2 進数への変換が通常どおりに行われないことを意味しますか?たとえば、右から左ではなく、左から右に行われます:

binary(a)=1000 0000 | 0000 0000


so*(p)=1;binary(a)=1000 0000 | 0000 0000これ1を 10 進数
*(p+1)=2;作成binary(a)=1000 0000 | 0100 0000し、これ513
を正確にプログラムの出力にします。

4

2 に答える 2

3

上記のプログラムを実行したときに異なる結果が得られた理由はありますか?

はい。言語にとらわれない答え: このプログラムは未定義の動作を呼び出すためです。実際に何が起こったのかを考慮して答えてください。システムのエンディアンは、あなたが考えているものとは異なります。

于 2012-12-08T20:01:11.557 に答える
3

ここで起こることはshort、リトル エンディアンの CPU アーキテクチャに 2 バイトがあるという事実によるものです。標準ではアーキテクチャが LE である必要はありません。そのため、いずれの場合でも、このプログラムをさまざまなシステムで実行すると、さまざまな結果が生成される可能性があります。

ここshortでは、最下位バイト (LSB) が最初になるようにメモリに配置されます。

         Memory addresses ------>
            LSB          MSB

         0000 0000   0000 0000

pLSB をポイントし、次のように設定し1ます。

         0000 0001   0000 0000

a として解釈されたときの結果shortは、LSB + 256 * MSB、つまり 1 + 0 * 256 = 1 です。

p次に、MSB (次のメモリ アドレスにある) をポイントし、次のように設定します2

         0000 0001   0000 0010

として解釈された場合の結果short: 1 + 2 * 256 = 513

于 2012-12-08T20:01:14.530 に答える