枚举已签名

时间:2012-08-09 13:48:57

标签: c++ enums

以下代码:

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&amp; e3不能保存大于1的值,因为它们必须为其符号保存一位。我需要一种方法告诉编译器不要使用此位进行符号,而是将其用于代替值。 我试过了:

enum AeF3 : byte

但它没有帮助。而不是-2,254被比较,而2不等于-2也不是254。

1 个答案:

答案 0 :(得分:2)

整个方法都错了。 C ++ 03中的枚举类型(以及C ++ 11中的语法)未指定,并且创建具有基础枚举类型(或一般的有符号类型)的位域不是正确的方法。你应该这样做:

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

请注意,无论您使用AeF3还是unsigned int,所有成员{{1 },e1e2将是整数类型(而不是枚举)