• ベストアンサー

long型のデータをバイト型の配列に代入する方法

long型のデータを配列を使って1byte毎に分けたい処理を作りたいのですが、 やりかたとしてはlong型のアドレスをポインタ変数に渡して、 ポインタ変数をバイト配列に代入する方法になりますでしょうか? 具体的なプログラムはこんな感じと考えてますが unsigned long LONG: unsigned char AAA[8], *pon, i: pon = &LONG for(i=0 i<8 i++) { AAA[i] = *pon + i; } C言語に詳しい方教えてください、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

バイトオーダーを無視してよいのであれば... memcpy(AAA, &LONG, sizeof(LONG)); とするのが基本です。 以下のように、共用体を使う方法もありますが、任意のバイト配列に格納するにはさらにコピーが必要になります。 union U {  unsigned long LONG;  unsigned char AAA[sizeof(unsigned LONG)]; } u; u.LONG = 値; もし、ビッグエンディアンとして扱いたいのであれば次のようにします。 for (std::size_t i = 0; i < sizeof(LONG); i++)  AAA[i] = LONG >> (CHAR_BIT * (sizeof(LONG) - 1 - i)); リトルエンディアンとして扱うなら次のようにしてください。 for (std::size_t i = 0; i < sizeof(LONG); i++)  AAA[i] = LONG >> (CHAR_BIT * i); ちなみに、unsigned char型は必ず1バイトですが、ビット数は8ビットとは限りませんので、必ずCHAR_BITを使う必要があります。 また、unsigned long型が何バイトなのかも処理系定義です。 32ビット以下の多くの処理系や64ビットWindowsではunsigned long型は32ビットですが、多くの64ビットの処理系ではunsigned long型は64ビットです。 また、char型が16ビットや32ビットや64ビットの処理系も実在しますので、その場合はunsigend long型が2バイトや1バイトになることもあります。 一部のDSPではunsigned long型が48ビットで6バイトというものも存在します。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

「longは4バイト」などという出鱈目を書くのはいかがなものか>#3. あと, エンディアンを意識しなければならないがゆえに, この文章ではどうすべきかわからない. 「1byte毎に分けたい」というのはいいとして, その各バイトはどのように並んでいてほしい?

すると、全ての回答が全文表示されます。
  • black2005
  • ベストアンサー率32% (1968/6046)
回答No.3

longは4バイト、あと正確に行うにはエンディアンを意識する必要あり よって共用体を使うのが鉄則 共用体やエンディアンはネットで検索すべし

すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

memcpy(AAA,&LONG,8); としてください。

すると、全ての回答が全文表示されます。
回答No.1

*(unsigned long*)AAA = LONG; ではダメかの?

すると、全ての回答が全文表示されます。

関連するQ&A