概念

2012-04-25 16 views
3
struct A 
{ 
int a:2; 
int b:3; 
int c:3; 
}; 

int main() 
{ 
struct A p = {2,6,1}; 
printf("\n%d\n%d\n%d\n",p.a,p.b,p.c); 
return 0; 
}  

出力は: -2、-2,1概念

のCコンパイラおよびC++コンパイラに上記のコードの出力であろうか? なぜですか?

+0

こちらをご覧ください:http://ideone.com/o817J –

+0

はい、回答は出力ごとです。 –

+0

ビットフィールドは、符号なしの値に対してのみ正常に動作します(符号付きの値の動作が未定義かどうかは不明です)。 –

答えて

1

が今まさに起こっているかを見ることができます署名のビットフィールドについて読ん1

平野です。

struct A 
{ 
int a:3; 
}; 
int main() 
{ 
struct A p = {5}; 
printf("%d",p.a); 
} 

3ビットのうち、この3ビットセットの符号ビットは1であり、したがって負の値であるため、値は101(5)になります。したがって、011の3の101の2の補数を見つける必要があります。 上記のロジックを適用することにより、-3として出力されます。同様に他のものも証明できる。

1001(9)の場合、3ビットの値をとります:3。したがって、それは001(1)になります。ここでは符号ビットが1にセットされていないので、2の補数を使用する必要はない。真っ直ぐ前方の答えは1になります。 同様に他の人ができます。

3

私のCコンパイラでは-2 -2 1になります。問題は、格納しようとしている数字のビットフィールドが小さすぎることです。最初の2つのケースでは、左端のビットは1であるため、負の数として解釈されます。 、この問題を解決するには、次のいずれか

  1. は、あなたのビットは
  2. がunsigned int型へ
  3. キャスト印刷する前に、符号なし整数型の代わりに、int型など、あなたのビットフィールドを宣言し、より大きなフィールド作成し、uが印刷する%を使用します。
1

あなたは、このプログラムは、同じ理由で、これらの答えを得る:

#include <stdio.h> 
#include <stdint.h> 

int main(void) 
{ 
    int32_t a = 4294967294; 
    printf("%d\n", a); 
    return 0; 
} 

が出力-2を持っています。大きすぎる数値で符号付き変数を初期化すると、異なる解釈が行われます。仕様から:

それ以外の場合は、新しい型が署名され、その値を表現できません。結果がインプリメンテーションによって定義されるか、インプリメンテーション定義のシグナルが発生します。

5

ご使用のシステムには2's complementが使用されているようです。 2-bitビットフィールド保持2は、2進数で-2であるバイナリで10となります。同様に110(6)は、2の補数で表される3-bitの場合は-2です。そして1here