次のようにメモリを埋めます。
char buf[8] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
そして、最初の 5 バイトと出力結果に順番に unsigned long ポインターを置きます。
char *c_ptr;
unsigned long *u_ptr;
c_ptr = buf;
for (int i=0;i<5;i++)
{
u_ptr = (unsigned long *)c_ptr;
printf("%X\n",*u_ptr);
c_ptr++;
}
x64 プラットフォームでこのコードを実行すると、期待どおりの結果が得られます。
44332211
55443322
66554433
77665544
88776655
しかし、ARM プラットフォームで同じコードを実行すると、次のようになります。
44332211
11443322
22114433
33221144
88776655
つまり、4 バイトごとにバインドされ、この境界内の 4 バイトのみを逆参照します。
pointer_value%4 != 0
だから私は、この動作(いつ)が間違っているのか、それとも実装固有のものなのかを尋ねたいと思いますか?
UPD:エンディアンについては知っていましたが、これが正しいことを知りたいです。
11443322
それ以外の
55443322
つまり、たとえばポインターがある場合、 の代わりに、、および よりも0x10000001
アドレスを持つバイトから unsigned long を作成します。0x10000001
0x10000002
0x10000003
0x10000000
0x10000005