2016-10-30 13 views
1

私はCでポインタについて学習しています。私はこのプログラムを持っています。メモリ内のポインタと整数表現

void print_bytes(void *start, size_t size); 

int main(int argc, char *argv[]) 
{ 
    int val = 42; 
    print_bytes(&val ,sizeof(val)); 

    return 0; 
} 

void print_bytes(void *start, size_t size) 
{ 
    int i = 0; 

    for(i = 0; i < size; i++) 
    { 
     printf("%02X ", *((unsigned char *)start + i)); 
    } 
} 

私はhexadecimal形式で各バイトの値を印刷しようとしているが、機能print_bytesでstart pointer変数によって指されます。

私が知っている限り、変数がメモリに格納されるとき、変数はバイナリ形式で格納されます。私は、コードを実行した場合

は、これが私の分析です:

42は最初の8に収まる:メモリは、メモリ内の表現がある整数値42を保持している場合はsizeof整数の変数は、その後4 bytes (32 bits) あるとし メモリ内のバイトのビット表現。

バイナリ:00000000000000000000000000101010

ので、私は2Aを得たコードを実行した場合。今のところ、出力は正しいです。

メモリ(すなわちメモリ内のバイナリ値を表すために単一のバイトよりも明確に必要とされる)、42より大きい整数値を保持3000を考えるならば、メモリ内の表現である:

バイナリ:00000000 00000000 00001011 10111000

コードを実行すると、私はBB 80 00 00のinseadが間違っているように見える 'B8 0B 00 00'が表示されます。

誰かが間違っていることを説明してください。私はこれを何時間も解決しようとしていますが、手がかりはありません。

ありがとうございます。私はすべての答えを感謝し、それらから学ぶことを試みる。

+2

[endianness](https://en.wikipedia.org/wiki/Endianness)についてはこちらをお読みください。 –

+2

最初の例で '42'を使って監視しました。このプログラムはあなたが言うように '2A'を印刷しただけではなく、' 2A 00 00 00'を印刷しました。つまり、最下位バイトが最初になります。 –

答えて

0

短いエンディアンでは、ビットのみのバイトには適用されません。

あなたが使用しているプラ​​ットフォームはどれも、下のビットが右側にあるように動作します。あなたはシフト右(>>)は常に値を減らさないので、これを知ることができます。

プラットフォームはリトルエンディアンです。したがって、バイナリ値00000000 00000000 00001011 10111000(慣例の最上位桁の最初の書式で書かれています)は10111000 00001011 00000000 00000000として格納されます。

ビットが反転されていないことに注意してください。ヘクスにそれを回して行くことは、私たちを与える:

10111000 00001011 00000000 00000000 
B 8 0 B 0 0 0 0 

脚注:ビットが物理的に保存されている方法が定義されていません。我々は、どのようにコンピュータのメモリが論理的にCであなたに表されているかについて話しています。