4

私はCの初心者です。以下のコードの出力に関して多くのことをグーグルで検索しましたが、あまり役に立ちませんでした。

コードは次のとおりです。

struct str
{
    int i: 1;
    int j: 2;
    int k: 3;
    int l: 4;
};

struct str s;

s.i = 1;
s.j = 2;
s.k = 5;
s.l = 10;

printf(" i: %d \n j: %d \n k: %d \n l: %d \n", s.i, s.j, s.k, s.l);
Output:
i: -1
j: -2
k: -3
l: -6

誰かが出力がそうなのか説明できますか?ありがとう。

4

2 に答える 2

9

あなたのフィールドはそうではないのでunsigned、したがってそれらは署名されています。

符号付きフィールドがある場合、その最上位ビットは負の値を示します。これは、正の値よりも負の値が常に1つ多いことを意味します。少なくとも、使用する実装では、負の値に2の補数を使用しているようです。

104ビットのビットフィールドにaを入れると、1010負の値(-6)になります。

53ビットのビットフィールドにaを入力する101と、負の値(-3)になります。

22ビットのビットフィールドにaを入力する10と、負の値(-2)になります。

11ビットのビットフィールドにaを入れると、1負の値(-1)になります。

struct str
{
    unsigned int i: 1;
    unsigned int j: 2;
    unsigned int k: 3;
    unsigned int l: 4;
};

あなたはあなたが望むことを達成することができるはずです。

于 2012-06-17T13:39:32.877 に答える
0

あなたはビットフィールドを使用しましたが、記号が表すためにビットを必要とし、それらに割り当てた値より下に範囲を狭めるという事実を考慮していません。そのサイズの符号付き整数を格納する場合は、フィールドのストレージを拡大する必要があります。

于 2012-06-17T13:39:21.397 に答える