ポインタについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
マサキ

ポインタについて

#1

投稿記事 by マサキ » 17年前

お久しぶりです。最近は専らjavaばかり使ってました。

しかし最近C言語を再び使うようになったので、まず復習としてポインタの事を勉強しなおしてました。
そこで様々なサンプルプログラムを眺めてたのですが、よくわからないプログラムがありました。
それは添付したファイルを参照してみてください。
#include<stdio.h>
int main(void){
  short ai[4] = {1, -128, -256 , -257};
  short *ai2=(short *)((char *)((int *)ai+1)-3)+sizeof(ai)/sizeof(int)-1;
  int n;
  for (n=-1 ; n<2 ; n++)
    printf("%d,%d\n",n,ai2[n]);
}
 

このプログラムを実行すると結果は

-1 , -32768
0 , 255
1 , -1

のようになります。


なんでこのような出力結果になるのかがよく理解できません。
色々調べて自分なりに考えてみたのですがよく分かりませんでした。
どういった構造でこの結果が導き出されるのか説明していただけるととても助かります。

よろしくお願いいたします。

toyo

Re:ポインタについて

#2

投稿記事 by toyo » 17年前

10進数だとわかりにくいので16進数にします
short ai[4] = {0x0001, 0xFF80, 0xFF00 , 0xFEFF};
バイトオーダーをリトルエンディアンとするとアドレス ai には
  +000 +001 +002 +003 +004 +005 +006 +007
ai 0x01 0x00 0x80 0xFF 0x00 0xFF 0xFF 0xFE
のようにメモリに格納されます。
(int *)ai+1
ですが int型が4バイトとすると+1で4バイト移動するので上記の+004のアドレスになります
(char *)((int *)ai+1)-3)
では char型にキャストされるので3バイト戻って上記の+001のアドレスになります
+sizeof(ai)/sizeof(int)-1
は +8/4-1 ですので結局 +1になります
(short *)で+1ですので2バイト進んで上記の+003の位置が ai2 に代入されます
出力時の配列の位置を上記アドレスで見ると
ai2[-1]は+001 = 0x8000 = -32768
ai2[0]は+003 = 0x00FF = 255
ai2[1]は+005 = 0xFFFF = -1

マサキ

Re:ポインタについて

#3

投稿記事 by マサキ » 17年前

お返事ありがとうございました。
キャストによって動く量が違うんですね。やっと構造が理解できました。
しかし
0x8000 = -32768
0x00FF = 255
0xFFFF = -1

というのがよくわかりません。何故こうなるのですか?
とりあえず16進数についても復習してみます。

Mist

Re:ポインタについて

#4

投稿記事 by Mist » 17年前

「2の補数」で調べればわかると思います。

閉鎖

“C言語何でも質問掲示板” へ戻る