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++コンパイラに上記のコードの出力であろうか? なぜですか?
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++コンパイラに上記のコードの出力であろうか? なぜですか?
が今まさに起こっているかを見ることができます署名のビットフィールドについて読ん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になります。 同様に他の人ができます。
私のCコンパイラでは-2 -2 1になります。問題は、格納しようとしている数字のビットフィールドが小さすぎることです。最初の2つのケースでは、左端のビットは1であるため、負の数として解釈されます。 、この問題を解決するには、次のいずれか
あなたは、このプログラムは、同じ理由で、これらの答えを得る:
#include <stdio.h>
#include <stdint.h>
int main(void)
{
int32_t a = 4294967294;
printf("%d\n", a);
return 0;
}
が出力-2
を持っています。大きすぎる数値で符号付き変数を初期化すると、異なる解釈が行われます。仕様から:
それ以外の場合は、新しい型が署名され、その値を表現できません。結果がインプリメンテーションによって定義されるか、インプリメンテーション定義のシグナルが発生します。
ご使用のシステムには2's complementが使用されているようです。 2-bit
ビットフィールド保持2
は、2進数で-2
であるバイナリで10
となります。同様に110(6)
は、2の補数で表される3-bit
の場合は-2
です。そして1
もhere
こちらをご覧ください:http://ideone.com/o817J –
はい、回答は出力ごとです。 –
ビットフィールドは、符号なしの値に対してのみ正常に動作します(符号付きの値の動作が未定義かどうかは不明です)。 –