ページ 11

char型の配列をint型の配列に格納する方法

Posted: 2011年8月04日(木) 23:52
by ダイエッター

コード:

【質問内容】
 char型の2つの配列2バイトをint型の配列先頭に格納する方法を教えてください。
 以下、コードを記載します。
 

int main()
{
  char a[1]={0xf,0xf};
  int buf[1]={0x0000,0x1111};

  //int buf[0]の先頭2バイトに>a[0]と[1]の2バイトを格納し、buf[0]=0xff00にしたいです。
   
  return 0;
}

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


Re: char型の配列をint型の配列に格納する方法

Posted: 2011年8月05日(金) 00:06
by box
ダイエッター さんが書きました:

コード:

  char a[1]={0xf,0xf};
  int buf[1]={0x0000,0x1111};
今回の問題を解決する前に、勉強しなければならないことがありそうです。
a[1]

buf[1]
と定義した配列では、アクセスできるのは
a[0]

buf[0]
だけです。
a[1]

buf[1]
も、配列の定義範囲外の領域です。

Re: char型の配列をint型の配列に格納する方法

Posted: 2011年8月05日(金) 00:19
by ダイエッター
すみません。勉強不足でした。
以下でしょうか?

int main()
{
char a[2];
a[0]=0xf;
a[1]=0xf;
int buf[2]={0x0000,0x1111};

//int buf[0]の先頭2バイトに>a[0]と[1]の2バイトを格納し、buf[0]=0xff00にしたいです。

return 0;
}

Re: char型の配列をint型の配列に格納する方法

Posted: 2011年8月05日(金) 02:47
by bitter_fox
ダイエッター さんが書きました: char a[2];
a[0]=0xf;
a[1]=0xf;
int buf[2]={0x0000,0x1111};

//int buf[0]の先頭2バイトに>a[0]と[1]の2バイトを格納し、buf[0]=0xff00にしたいです。
まず、1バイトというのは多くの場合8ビットであり、2進数で表すと0から11111111までで16進数だと0~FFになります。
仮にダイエッターさんの環境がそうであるならば、a[0]およびa[1]を16進数で厳密に表記すれば0Fとなります。
そして、int型が4バイトと仮定すると、int型の数値を16進数で表した場合は最大で8桁になり、先頭2バイトにa[0]とa[1]を格納した場合は0F0F0000となるべきです。

また、上に基づいたプログラムを作成するには、

コード:

0 :Fourth   Third    Second   First
1 :00000000 00000000 00000000 00000000
2 :                           00001111  a[0](0F)
3 :00001111 <<<<<<<< <<<<<<<< <<<<<<<<  a[0](0F)を3バイト左にビットシフトした結果
5 :                           00001111  a[1](0F)
6 :00000000 00001111 <<<<<<<< <<<<<<<<  a[1](0F)を2バイト左にビットシフトした結果
7 :00001111 00001111 00000000 00000000  3と6を合わせた結果
のような処理を行います。

3, 6で行っているビットシフトについては次を参考にしてください。
http://wisdom.sakura.ne.jp/programming/cs/cs7.html

7の処理は足し算で行っても良いですし、OR演算を用いても構いません。
http://www9.plala.or.jp/sgwr-t/c/sec14.html

より厳密なプログラムを組むのであれば3や6の時に不必要なビットを0に下げる処理を加える必要があります。

コード:

0 :Fourth   Third    Second   First
1 :00000000 00000000 00000000 00000000
2 :                           11110000  F0(char型)
3 :11111111 11110000 <<<<<<<< <<<<<<<<  F0を2バイト左にビットシフトした結果
4 :00000000 11111111 00000000 00000000  00FF0000
5 :00000000 11110000 00000000 00000000  3 & 4

4':00000000 00000000 00000000 11111111  FF(int型)
  :00000000 11111111 <<<<<<<< <<<<<<<<  FFを2バイト左にビットシフトした結果
5の処理はAND演算を用いてください。
なぜこの処理が必要になるかというと0xF0(char型)は負数でこれをシフトした結果も負数になり7の処理に支障が生じるためです。