2017-06-18 15 views
2
typedef unsigned char byte; 

unsigned int nines = 999; 
byte * ptr = (byte *) &nines; 


printf ("%x\n",nines); 
printf ("%x\n",nines * 0x10); 
printf ("%d\n",ptr[0]); 
printf ("%d\n",ptr[1]); 
printf ("%d\n",ptr[2]); 
printf ("%d\n",ptr[3]); 

出力:以下はなぜそれが何をするのですか?

3e7 
3e70 
231 
3 
0 
0 

私は、最初の2つは999と999 * 16のちょうど進数表現であることを知っています。残りの4はどういう意味ですか? ptr [0]〜ptr [3]?

+5

16進数で 'ptr'の値も印刷してみてください。 –

+3

ほとんどの場合、ビッグエンディアンマシンではなく、リトルエンディアンマシンを使用していることを意味します。おそらくインテルのマシンですが、必ずしもそうではありません。 –

+1

https://en.wikipedia.org/wiki/Endianness – Havenard

答えて

6

あなたが進で32ビットLEシステム999でこれを実行している可能性が高いです: -
00 00 03 E7 - それはメモリに格納される方法は、したがって
E7 03 00 00次のようになります -

ptr[0]ポイントには、を含むバイトの小数
ptr[2]点で3 03を含むバイトの231 ptr[1] 小数点
の点でE7を含むバイト小数

HTHで0である00を含むバイト10進
で0 ptr[3]ポイントです!

0

私はあなたが書いた場合、あなたがはっきりと表示されると思います。

typedef unsigned char byte; 

main() { 
unsigned int nines = 999; 
byte * ptr = (byte *) &nines; 

printf ("%x\n",nines); 
printf ("%x\n",nines * 0x10); 
printf ("%x\n",ptr[0]); 
printf ("%x\n",ptr[1]); 
printf ("%x\n",ptr[2]); 
printf ("%x\n",ptr[3]); 
printf ("%d\n",sizeof(unsigned int)); 
} 

チャーは8ビット、1バイトで、int型は、(私の64バイトのマシンで)4バイトです。 あなたのマシンでは、データはlittle-endianとして保存されるので、最初に有意なバイトが配置されません。

+0

単なる補足的な注記:バイト内のビットは、まだ最上位ビットが左にある「通常」の順序で格納されていますが、反転されたバイトです。パフォーマンスのためにリトルエンディアンが使用されますが、同じ値を異なる長さで読み取ることができますが、ビッグエンディアンでは同じ効果を得るためにポインタをオフセットする必要があります。 – Havenard

+0

@Havenard個々のビットはアドレス可能ではないので、バイトの内部で「ビットオーダー」について話すのが理にかなっているのだろうかと思います。 – HolyBlackCat

+0

@HolyBlackCat数値的に意味がありますが、もちろん意味があります。それは123と321の違いに似ています。 – Havenard

関連する問題