3

次の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ですよね?

私が間違っている場合は、説明してください。

4

3 に答える 3

5

-63 ビットの signed int の範囲を超えています。したがって、未定義の実装定義の動作のアーティファクトを観察しています(実際には、値の最も重要なビットが破棄されています)。

于 2013-09-01T15:34:37.883 に答える
4
{2,             |  -6,             |        5        }
010 last 3 bits |  010 last 3 bits |  01 last 2 bits
2                  2                        1    
于 2013-09-01T15:39:34.480 に答える
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 です。

それが役に立てば幸い。

于 2013-09-01T15:34:33.540 に答える