2017-06-23 17 views
1

私はCでの初心者ですと、コードのこの部分が働いているか理解することはできません。このC構造体がどのように値を出力しますか?

struct marks{ 
    int p:3; 
    int c:3; 
    int m:2; 
}; 

void main(){ 
    struct marks s={2,-6,5}; 
    printf("%d %d %d", s.p, s.c, s.m); 
} 

Iが出力されていることがわかった:2 2 1

しかし、試してみるの多くの後、私は数字にできませんでしたアウトプットがどのようにそのようなものになっているか私は構造体に関する知識が少ない。だから私はここで何か問題を感じているかもしれない。

+0

[Cでビットフィールドを使用するタイミング](https://stackoverflow.com/questions/24933242/when-to-use-bit-fields-in-c) – Gaurav

+2

int 'c' 'p 'は3ビットしか持たない。 3ビットでは、0から7までの0から7、0から3、そして(符号付き) 'int'を使用して-1から-4の8つの値しか使用できません。変数に3つの下位ビットしかセットされていなければ、3ビットの 'int'に-6を挿入することはできません。 –

+1

あなたは何を期待しましたか?あなたはなぜ、水でいっぱいの2つのバケツを1つのバケツに入れることができると思いますか?これはビットフィールドに関連するものではなく、単に小さすぎる整数型を使用するだけです。コンパイラを有効にしましたか?何故なの?はいの場合:コンパイラーは警告しませんでしたか?なぜあなたはそれらを無視しましたか?あなたのコードは実装定義の変換に依存しています。 – Olaf

答えて

3

あなたが定義したstructの中には、、c:2m:2が実際にビットフィールドを示しています。 C言語のビットフィールドについて詳しく知りたい場合は、link、またはlinkをWikipediaでご覧ください。

簡潔にするために、コロン(:)記号の後の3または2は、幅3または2のビットフィールドを表していることがわかります。つまり、一連のビットを保持するために割り当てられた3または2隣接するコンピュータメモリの場所。

今、あなたのコードのmain()関数内:ここ

struct marks s={2,-6,5}; 

、2の

バイナリ値:00000010

-6の

バイナリ値:11111010

2進値5:00000101

ビットフィールドに応じて、2のバイナリ値から、010(10進数は2)の最後の3桁をとり、バイナリ値-6から、最後の2桁の10 (10進数では2)、バイナリ値5からは最後の3桁を01(10進数では1)にして、最後にp、cまたはmに割り当てます。

出力が2 2 1のようになります。

希望、私はあなたを明確にすることができます。

+0

ありがとうございました。 :) –

+1

あなたの説明は簡単で楽しく学べました –

+2

Cは_methods_をサポートしていません。 'main'はC++の_method_でもありません。あなたの説明は間違っています。結果は実装定義であるため、この結果の保証はありません。 – Olaf

2

最初にstructの宣言がビットフィールドを使用しています。

struct marks{ 
int p:3; 
int c:3; 
int m:2; 
}; 

はここに、P:3は、我々はint型になるようにPを定義していると我々は与えられた数のわずか3ビットを保持していることを意味します。たとえば、値5を表すには3ビットが必要です。これは101として表されます。下位2ビットは値1です。そのため、m = 1になります。

This link will give you more explanation.

感謝。

+0

ありがとう、これは役に立ちました:) –

関連する問題