つまり、arrという名前のCまたはC++のunsignedchar配列を(unsigned short *)arrとしてキャストし、それに割り当てた場合、結果はマシンのエンディアンとは無関係ですか?
補足-IBMやSOに関する他の場所での議論を例を挙げて見ました。
unsigned char endian[2] = {1, 0};
short x;
x = *(short *) endian;
... xの値はエンディアンのレイアウトに依存し、したがってマシンのエンディアンに依存すると述べています。つまり、配列の間接参照はエンディアンに依存しますが、配列に割り当てるのはどうでしょうか。
*(short*) endian = 1;
エンディアンに関係なく、将来のすべてのショートカット逆参照は1を返すことが保証されますか?
回答を読んだ後、私はいくつかのコンテキストを投稿したいと思いました:
この構造体では
struct pix {
unsigned char r;
unsigned char g;
unsigned char b;
unsigned char a;
unsigned char y[2];
};
unsigned chary[2]をunsignedshortyに置き換えても個人差はありませんが、これらの構造体の配列を作成して別の構造体に入れると、コンテナ構造体のサイズが大きくなる傾向があることに気付きました。 「unsignedshort」バージョンなので、大きな配列を作成するつもりなので、スペースのオーバーヘッドを節約するためにunsignedchar[2]を使用しました。理由はわかりませんが、uchar[2]をメモリに配置する方が簡単だと思います。
単一の短い長さの数値を意味するその変数yを使用して大量の計算を行う必要があるため、ucharバイトに個別にアクセスすることを避けるために多くの短い値をキャストしていることに気付きます...醜いバイト固有の数学を回避する方法ですが、エンディアンについて考え、次のようにすべてをキャストした場合でも数学が正しいかどうかを考えました
*(unsigned short*)this->operator()(x0, y0).y = (ySum >> 2) & 0xFFFF;
...これは、2次元配列で4つの隣接する近傍を平均化するプログラムの行ですが、重要なのは、uchar[2]フィールドを単一として処理する必要のあるこれらの操作がたくさんあるということです。ショートであり、エンディアンに依存しないショートの操作方法として、最も軽量な(つまり、アクセスまたは割り当てが必要になるたびにエンディアンベースのif-elseステートメントがない)方法を見つけようとしています。