0

私はいくつかのCコードを調べていて、この構文に出くわしました:

uint16 a;
unsigned char *b;
//b is initilized elsewhere before the next line gets called
((unsigned char*) &a)[0] = b[0];

それは私が得られない最後の行です。uint16 のアドレスを unsigned char に型キャストします。どうしてこれなの?&a のアドレスが 8 バイトを超える可能性があります。また、等号の左側にある [0] は何ですか?

4

3 に答える 3

2

のアドレスを取得し、それを( nota )にキャストし、それに 0 を追加 (no op) し、逆参照してから、 の結果を代入します。つまり、のメモリ内表現の最初のバイトにの結果を代入しています。unsigned char* unsigned charb[0]b[0]a

は初期化されていないためb、未定義の動作が呼び出されます。

于 2013-09-29T00:47:58.090 に答える
2

b[0]の一部にコピーしaます。どの特定の部分が依存しているか:

  • エンディアン: リトル エンディアンまたはビッグ エンディアン

  • 各タイプのサイズ ( uint162 バイト、unsigned charおそらく 1 バイトを使用します)。

注: で変更された「バイト」aは、常に最初のバイトになります。エンディアンは重要です。最初のバイトが最も重要であるか、またはそれほど重要ではない可能性があるからです。

于 2013-09-29T00:48:16.927 に答える
0

これは、最適化のために一度に単語全体を使用したい int 型でより一般的です。比較したい大量の文字列セットがあり、最初の 4 文字だけを比較する必要があるとします。遅い一連の strncmp() を使用するのではなく、各 char 配列を int にキャストして直接比較を行うことができます。一般的な用途は、Web サーバーでの GET、POST、HEAD... 要求です。エンディアンに応じて、キャスト値は「TSOP」または「POST」の形式をとる場合があります。これは、他のタイプ (uint16 を含む) の場合も同様であるため、使用しているコードは#ifdefs なしでは移植できない場合があります

注: 'POST' (または 'TSOP') を比較として使用すると、マルチバイト文字に関する警告が表示される場合があります。回避策 (警告を無効にする以外) は ('P'|'O'<<8 |'S'<<16|'T'<<24) またはエンディアンに応じてその逆 - switch() で使用できる const int にコンパイルされます。

于 2013-09-29T03:32:49.957 に答える