1 バイトが 8 ビットで、メモリがリトル エンディアンのバイト順で配置され、int
がメモリ内の 4 バイトを表す、かなり典型的なプラットフォームを想像してみましょう。このプラットフォームでは、値は次の1
ように配置されます。
00000001 00000000 00000000 00000000
^
the first element of 'a'
p
char
は(notへの) ポインターとして宣言されint
、 array の最初の要素を指すように初期化されa
ます。char
このプラットフォームの Aは 1 バイトを表します。int
として解釈された上記の値は次のchar
ようになります。
00000001 -------- -------- --------
| |
------
char is only 8 bits wide
したがって、1 バイトを読み取っても 4 バイトを読み取っても、つまり を読み取っても を読み取って*p
もa[0]
、値は1
です。p
ただし、へのポインタであるをインクリメントすると、メモリ内char
の次の文字、つまり次のバイトを指すようになります。
00000001 00000000 00000000 00000000
00000001 00000000 -------- --------
^ ^ ^ ^
p p+1 p+2 p+3 ...
a[1]
は次のint
( 2
) をp[1]
指し、次のchar
、つまり を指し0
ます。
余談ですが、特定のプロセッサがリトル エンディアンまたはビッグ エンディアンのバイト順を使用しているかどうかを判断する方法を実際に見つけました。システムがビッグ エンディアン (最上位バイトが最初) の場合、最初printf
に 0 が出力されます。これは、メモリ レイアウトが変更されたためです。
0000000 00000000 00000000 00000001
^
the first element of 'a'
0000000 -------- -------- --------
^
p
値 1 を表すビッグエンディアン順に配置された複数のバイトがあり、最初のバイトのみを読み取る場合、その値 (1
または0
) を使用してマシンのエンディアンをテストできます。
int n = 1;
if(*(char*)&n == 1)
// little endian
else
// big endian