-4

次のコード:

void f3()
{
    enum AeF3
    {
        f3E1 = 1,
        f3E2,
        f3E3,
    };
    struct AsF3
    {
        AeF3 e1:2, e2:2, e3:2;
    };
    AsF3 inst;
    inst.e1 = f3E1;
    inst.e2 = f3E2;
    inst.e3 = f3E3;
    cout << "inst.e1 is " << ((inst.e1 == f3E1) ? "" : "not ") << "equal to f3E1" << endl;
    cout << "inst.e2 is " << ((inst.e2 == f3E2) ? "" : "not ") << "equal to f3E2" << endl;
    cout << "inst.e3 is " << ((inst.e3 == f3E3) ? "" : "not ") << "equal to f3E3" << endl;
}

次の出力が生成されます。

inst.e1 is equal to f3E1
inst.e2 is not equal to f3E2
inst.e3 is not equal to f3E3

キャストなしでこのエラーを修正するにはどうすればよいですか?

詳細説明

e2 と e3 は、符号のために 1 ビットを保存する必要があるため、1 より大きい値を保持できません。このビットを符号に使用せず、代わりに値に使用するようにコンパイラに指示する方法が必要です。私は試した:

enum AeF3 : byte

しかし、それは役に立ちません。-2 の代わりに 254 が比較されますが、2 は -2 にも 254 にも等しくありません。

4

1 に答える 1

2

アプローチ全体が間違っています。C++03 (および C++11 のその構文) の列挙型は指定されておらず、基礎となる列挙型 (または一般に符号付き型) を使用してビットフィールドを作成することは正しいアプローチではありません。おそらく次のようにする必要があります。

struct AsF3 {
   unsigned int e1 : 2;
   unsigned int e2 : 2;
   unsigned int e3 : 2;
};

ビットフィールドの型は基になるストレージ型であり、格納されている各要素の型ではないことに注意してください。AeF3またはを使用するかどうかに関係なくunsigned int、すべてのメンバーe1、は整数型e2e3なります (列挙型ではありません) 。

于 2012-08-09T14:05:39.633 に答える