我正在尝试将数据字节存储到枚举中,
enum bufferHeaders
{//output_input
void_void = 0x0003010000,
output_void = 0x00030B8000,
void_input = 0x0006010000,
led_on = 0xff1A01,
led_off = 0x001A01,
};
我的值的前导零被忽略,编译器将我的值存储为int。
后来我需要能够找到每组数据确切是多少个字节。
答案 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
结构中可能是个不错的方法,在该结构中,您可以将枚举值用作键本身,并且该值将是数字值以您要存储的方式为准。