0

ポインターを使用して uint16_t 値を uint8_t 配列に挿入しようとしています。以下はうまくいくと思いますが、できませんでした。問題が何であるかについての手がかりはありますか?

uint8_t myarray[10];
uint16_t value = 10000;
uint16_t * myptr = (uint16_t *)(myarray+2);
*myptr = value;

私はそのようにできることを知っていますが、なぜ上記がうまくいかないのですか?

uint8_t myarray[10];
uint16_t value = 10000;
uint8_t * myptr = (myarray+2);
uint8_t * myptr2 =(myarray+3);
*myptr = value>>8;
*myptr2 =value;
4

2 に答える 2

3

2番目のバージョンは、最上位バイト(値39)をに書き込み、最下位バイト(myarray[2]値16)をに書き込みますmyarray[3]

最初のバージョンは、コンピューターのエンディアンによって決定された順序で2バイトを書き込みます。最近のほとんどのコンピューターはリトルエンディアンです。つまり、マルチバイト整数値の最下位バイトがメモリの最初に来るため、このバージョンは2バイトを他のバージョンとは逆の順序で書き込みます。

それがあなたが見ている問題だと思います。それ以外の場合は、「できなかった」よりも具体的にお願いします。

また、最初のバージョンは技術的に未定義の動作をしており、十分にエキゾチックなコンピューターではまったく予期しないことをする可能性があります。2番目のバージョンのように明確に定義されたコードに固執することをお勧めします。プロファイリングにより、明確に定義されたコードが遅すぎることと、危険なポインターエイリアシングコードの方が速いことが明らかになった場合にのみ、疑わしい最適化を使用してください。reinterpret_castまた、邪悪なCスタイルのキャストではなく使用することをお勧めします。動作は変わりませんが、何か奇妙なことが起こっていることがわかりやすくなります。

于 2012-10-03T04:24:53.617 に答える
1

次のように実行できます。

uint8_t * value_data = reinterpret_cast<uint8_t*>(&value); // cast to `(unsigned) char*` is allowed by standard
myarray[0] = value_data[0];
myarray[1] = value_data[1];
于 2012-10-03T04:41:04.080 に答える