C言語で2バイト以上の型の配列を1バイト単位でアクセスする方法を教えてください 例えば long long_data[10]; の配列を1バイト(8bit)単位でアクセスしたい場合

C言語関連155閲覧xmlns="http://www.w3.org/2000/svg">100

ベストアンサー

0

ThanksImg質問者からのお礼コメント

当方C言語の初心者で組込みのソフト開発しております。 キャストで警告を抑えれば良いのですね。 UARTでデータを送る場合はbyteアクセスをしたくなります。 nka********さんも組込み系かとお見受けします。 ありがとうございました。

お礼日時:9/19 0:57

その他の回答(4件)

0

共用体(union)で定義すると、ビット、バイト等、自由にアクセスできます。

0

文字型であれば、CHAR_BIT 単位のアクセスが保証されます。 CHAR_BIT というのは char 型のビット数のことです(大抵8ですが。世の中には1バイトが8ビットではないCPUもあるので)。 つまり、1バイト単位でのアクセスが出来ます。 char, unsigned char, signed char のいずれでも問題ありません。 例えば、long 型は1バイトではない場合が殆どです。 その long 型に1バイトずつアクセスしたい場合は、次のようにアクセス出来ます。 long value = 12345; unsigned char value_object_representation[sizeof(value)]; memcpy(value_object_representation, &value, sizeof(value_object_representation)); for (size_t i = 0; i < sizeof(value_object_representation); ++i) {     printf("%0*hhx", (int)((CHAR_BIT + 3) / 4), value_object_representation[i]); } または、文字型へのポインタ型でも良いです。 これが配列になったとしても、同様にアクセス出来ます。

1

一番簡単で基本的な物は、共有体を作ること。 union _LLC{ long long_data; char char_data[4]; // or [8]; } x; x.long_data = 0x12345678; printf("%x", x.char_data[0] ); 12 が出るか、78が出るかは、環境次第。

1人がナイス!しています

0

できるできないで言えば、できます。 やったところで無意味です。 やり方はいろいろありますが cast や struct などなど型を変換すれば良いです。 しかし、並びは保証されません。 CPUのアーキテクチャに依存するからです。 例えば、ビッグエディアンとスモールエディアンで並びが違います。 しかも、どちらも選べるCPUもある。 パディングの方法も規則がありません。 なので、制御するにはコンパイルオプションを指定する必要がある。