【问题标题】:Signedness of enum in C/C99/C++/C++x/GNU C/GNU C99C/C99/C++/C++x/GNU C/GNU C99 中枚举的签名
【发布时间】:2011-02-04 11:21:21
【问题描述】:

enum 类型是有符号还是无符号?枚举的签名是否在 C/C99/ANSI C/C++/C++x/GNU C/GNU C99 之间有所不同?

谢谢

【问题讨论】:

    标签: c++ c enums c99 signed


    【解决方案1】:

    枚举保证由整数表示,但实际类型(及其符号)取决于实现。

    您可以通过为枚举数之一赋予负值来强制枚举由有符号类型表示:

    enum SignedEnum { a = -1 };
    

    在 C++0x 中,可以显式指定枚举的底层类型:

    enum ShortEnum : short { a };
    

    (C++0x 还增加了对作用域枚举的支持)

    为了完整起见,我将在 The C Programming Language, 2nd ed. 中添加,枚举数被指定为类型为 int(第 215 页)。 K&R 不是 C 标准,因此对于 ISO C 编译器来说这不是规范,但它确实早于 ISO C 标准,所以从历史的角度来看,它至少是有趣的。

    【讨论】:

    • gcc 实际使用的签名是什么?
    • @osgx:我猜这取决于枚举数的数量及其值的范围。我真的不知道。
    • C 标准还规定每个枚举常量 的类型为int。然而,术语“枚举常量”是指在enum { } 块内声明的值常量。具有enum 类型的变量可以具有 C 中的任何整数类型,例如如果可以表示所有值,它可能是比int 更短的类型。 (例如,GCC 有一个选项 -fshort-enums 可以做到这一点。)
    • 术语“枚举器”通常被理解为枚举常量,而enum{} 中的AFAIK 它们从来没有小于int 的类型,因为编译器还不知道会遵循什么值.
    • @osgx GCC 在编译时决定将什么签名应用于enum。我有一个枚举器,其值从零向上并在函数内检查该枚举器的值是否永远不小于零(它用作数组索引)。 GCC 给我一个警告 avServerApi.c:23: warning: comparison of unsigned expression < 0 is always false 如果我在 enum 中放了一个虚拟的 -1,那么随着枚举数的签名,警告就会消失。
    【解决方案2】:

    这是一个老问题......但我刚刚发现了这个:

    typedef unsigned ENUMNAME;  // this makes it unsigned in MSVC C 2015
    typedef enum {v0, v1, v2, v3} ENUMNAME;
    

    您可以将其用作 2 位无符号索引,例如:

    typedef struct {
      ENUMNAME i:2;
    } STRUCTNAME;
    

    在 GCC ARM 中尝试过 - 不起作用。
    此外,WinDbg 将 STRUCTNAME.i 显示为 数字,而不是 v0-v3。

    【讨论】:

    • 那段代码不是重新定义类型ENUMNAME吗?
    猜你喜欢
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2017-11-09
    • 2012-12-29
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多