アプリ版:「スタンプのみでお礼する」機能のリリースについて

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言語に詳しい方教えてください、よろしくお願いします。

A 回答 (5件)

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

    • good
    • 3

memcpy(AAA,&LONG,8);


としてください。
    • good
    • 2

longは4バイト、あと正確に行うにはエンディアンを意識する必要あり


よって共用体を使うのが鉄則
共用体やエンディアンはネットで検索すべし
    • good
    • 3

「longは4バイト」などという出鱈目を書くのはいかがなものか>#3. あと, エンディアンを意識しなければならないがゆえに, こ

の文章ではどうすべきかわからない. 「1byte毎に分けたい」というのはいいとして, その各バイトはどのように並んでいてほしい?
    • good
    • 2

バイトオーダーを無視してよいのであれば...



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バイトというものも存在します。
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています