我必须存储我将通过串行接收的指令和命令。命令的长度为8位。
我需要保持命令名和它的值之间的透明性。从而避免必须将串行接收的8位数字转换成任何类型。
我想在我的代码中使用枚举来处理它们。在此平台上,只有枚举与16位整数相对应。
平台是基于Butterfly demo board的AVR微控制器ATmega169V。它是一个8位系统,对16位操作有一些有限的支持。它不是一个速度很快的系统,并且有大约1KB的RAM。它没有任何像文件I/O或操作系统这样的奢侈品。
那么关于我应该使用什么类型来存储8位命令,有什么建议吗?
一定有比#定义的大量头更好的东西。
发布于 2009-11-09 14:54:08
gcc的-fshort-enums可能会很有用:
分配给“枚举”类型的字节数仅与声明的可能值范围所需的字节数相同。具体地说,“枚举”类型将等同于具有足够空间的最小整数类型。
事实上,here是一个有很多相关信息的页面。我希望你能遇到许多你从来不知道存在的GCC开关。;)
发布于 2010-02-27 15:57:46
您正在尝试解决一个不存在的问题。
您的问题被标记为C。在C语言中,值上下文中的枚举类型与整数类型完全兼容,并且行为就像其他整数类型一样。当在表达式中使用时,它们受到与其他整数类型完全相同的积分提升。一旦考虑到这一点,您就应该意识到,如果您希望以8位整数类型存储枚举常量所描述的值,那么您所要做的就是选择一个合适的通用8位整数类型(比如int8_t),并使用它来代替枚举类型。通过将枚举常量值存储在int8_t类型的对象中(与使用枚举类型显式声明的对象相反),您将完全不会丢失任何内容。
您所描述的问题将存在于C++中,其中枚举类型与其他整型类型分离得更远。在C++中,为了节省内存,使用整型类型代替枚举类型比较困难(尽管可能)。但不是在C中,因为它不需要任何额外的努力。
发布于 2009-11-09 14:43:21
我不明白枚举为什么不能工作。与枚举的比较和来自枚举的赋值应该都可以很好地与默认加宽一起工作。只是要注意你的8位值是有符号的(我想你会想要无符号的扩展名)。
您将以这种方式获得16位比较,我希望这不会是一个性能问题(它不应该是一个问题,特别是如果您的处理器是16位,因为它听起来是这样的)。
https://stackoverflow.com/questions/1699402
复制相似问题