次のCコードがあります。
struct values{
int a:3;
int b:3;
int c:2;
};
void main(){
struct values v={2,-6,5};
printf("%d %d %d",v.a,v.b,v.c);
}
コードを実行すると、次の出力が得られます。
2 2 1.
しかし、出力は であるはず2 -6 5
ですよね?
私が間違っている場合は、説明してください。
次のCコードがあります。
struct values{
int a:3;
int b:3;
int c:2;
};
void main(){
struct values v={2,-6,5};
printf("%d %d %d",v.a,v.b,v.c);
}
コードを実行すると、次の出力が得られます。
2 2 1.
しかし、出力は であるはず2 -6 5
ですよね?
私が間違っている場合は、説明してください。
-6
3 ビットの signed int の範囲を超えています。したがって、未定義の実装定義の動作のアーティファクトを観察しています(実際には、値の最も重要なビットが破棄されています)。
{2, | -6, | 5 }
010 last 3 bits | 010 last 3 bits | 01 last 2 bits
2 2 1
いいえ。出力は2 2 1
です。
C コンパイラは値を Binary に変換し、メモリに格納します。
2 のバイナリ値:00000010
-6 のバイナリ値: 11111010
(11111001+1)
バイナリ値 5 :00000101
メモリに保存中:
2 の場合は 010 が格納されます。
-6 の場合は 010 が格納されます。
5 の場合は 01 が格納されます。
メイン メソッドからこれらの変数にアクセスすると、va に対して "010" が返されます。ここでは、左端のビットが符号用です。
したがって、va は 2 です。同様に、vb は 2 で、vc は 1 です。
それが役に立てば幸い。