2016-04-01 6 views
2
#include<stdio.h> 
int main() 
{ 
    struct byte 
    { 
     int one:1; 
    }; 

    struct byte var = {1}; // statement A 
    printf("%d", var.one); 
    return 0; 
} 

ここで、私は整数変数 'one'のビットメモリを1に限定していることを前提としています。それは0と1だけを格納することができ、 'ステートメントA'ではこの変数を '1'で初期化しました。 '1'はまだメモリにビットを保持できますが、コンソールには-1が表示されます。どんな助け?なぜこのコードの-1を印刷するのですか?ビットフィールドが1に設定されていると、1になるはずです。

+0

問題が解決した場合は、緑色のチェックマークをクリックして回答を受け入れたものとみなしてください。 –

答えて

7

タイプintで定義されたビットフィールドはsigned int又はunsigned intと等しいかどうか実装定義あります。 (これは、ビットフィールドにのみ適用され、そうでない場合intsigned intとまったく同じである。)

を(それはあなたの実装であるように思われるよう)int one:1;が単一のビットは符号ビットであり、唯一可能なこと、その後、署名されている場合値は0-1です。範囲外であるため、初期化に使用した値1は暗黙的にに変換され、から-1に変換されます。 (実際には、変換の結果は実装定義である。)

変更宣言に:

unsigned int one:1; 

、それは値01を有することができます。ビットフィールドは、実際に署名が必要な場合を除き、通常は明示的に符号なしにする必要があります。その場合はintではなくsigned intを使用してください。

+0

それはオーバーフローエラーですか?私は 'int'の範囲がより大きな値を受け入れると思った(私はCについてほとんど何も言わず、この質問について興味があると述べるべきである) –

+0

' int';その範囲は少なくとも-32767〜+32767です。しかし、1ビットのビットフィールドは2つの値のうちの1つだけを保持することができ、符号付きの場合、それらの値は「-1」と「0」です。 (2の補数を仮定すると、そうでなければ '0'とおそらく' -0'しか保持できません) –

+0

私は混乱しているのは、intからbitへの変換がどこで起こっているかと思います。 –

関連する問題