如何保持枚举中的前导零?

时间:2018-07-20 12:19:10

标签: c++

我正在尝试将数据字节存储到枚举中,

    enum bufferHeaders
{//output_input
    void_void = 0x0003010000,
    output_void = 0x00030B8000,
    void_input = 0x0006010000,
    led_on = 0xff1A01,
    led_off = 0x001A01,
};

我的值的前导零被忽略,编译器将我的值存储为int。

后来我需要能够找到每组数据确切是多少个字节。

3 个答案:

答案 0 :(得分:5)

如果你写

enum bufferHeaders : int
{
    // ToDo - your values here
};

然后保证,后备类型为int,因此用于存储每个值的字节数为sizeof(int)。但是,您有责任确保enum的值可以适合int:例如0xff1A01

从数字上讲,保留前导零根本没有任何意义。

答案 1 :(得分:1)

您正在混淆数值和表示形式!

总是有多种方法来表示一个相同的值:77、0x4d,0x04d(猜想,这是我的出生年份)。我不会因为你改变代表而变老。

在内部,CPU拥有自己的值表示形式,如果它的寄存器(或RAM中的某处)是一个特定的位模式。

当打印整数或枚举值到控制台时,CPU的内部表示形式将转换为适合大多数情况的一些默认表示形式。如果要使用其他表示形式,则需要明确说明要应用哪种格式来检索这种表示形式:

    std::cout << std::hex << std::showbase << std::internal << std::setfill('0')
              << std::setw(10) << 77 << std::endl;

请注意,除std::setw之外的所有流修饰符都会持续修改流(直到下一次修改),因此,如果您随后想要使用不同的输出格式,则需要显式还原,而仅std::setw申请要输出的下一个值,并且必须为每个后续值重新应用。

答案 2 :(得分:1)

您是否特别需要使用枚举?默认情况下,每个值都具有相同的类型,并且您似乎专注于存储的数字值。如果您确实担心表示形式,那么将枚举保留为int并将值存储在std::map结构中可能是个不错的方法,在该结构中,您可以将枚举值用作键本身,并且该值将是数字值以您要存储的方式为准。