次のコードを考えてみましょう
#include <stdio.h>
#include <iostream>
using namespace std;
typedef struct bf_{
unsigned x:4;
unsigned y:4;
unsigned z:4;
unsigned w:4;
}bf;
int main(){
unsigned short i=8;
unsigned short j=9;
bf* bitfields=(bf *)&i;
bf*bit=(bf*)&j;
bitfields->w=12;
printf("%d\n",bitfields->x);
printf("%d\n",bit->y);
printf("%d\n",bitfields->w);
return 0;
}
このフラグメント
unsigned short j=9;
bf*bit=(bf*)&j;
printf("%d\n",bit->y);
私は、たとえばこの場所の後に、このコードのいくつかの興味深い特徴を推測した後に追加しました
bf* bitfields=(bf *)&i;
8を出力する書き込みprintf("%d\n",bitfields->x);
を行うと、ポインタと参照を使用してiの値がxに付与されることを理解しているため、たとえば8を出力すると、bitfiled->y
0が書き込まれるため、2番目の要素変数jを導入してbfstructerの新しいインスタンスを作成します。 jを参照してから、ステートメントbit-> yは9を書き込む必要があります。これは、私が理解しているように、順序定義ですが、なぜ0になるのでしょうか。このコードがどのように機能するか説明してください。私は英語を話せませんので、英語が下手でごめんなさい