1. 枚举类型的值占几个字节?

  2. 枚举值能否为负数?

  3. 枚举类型的值超过上限会怎样?

  4. 如果指定枚举类型占用字节数?

枚举类型占用字节数

  #include <stdio.h>
  enum {
      A,
      B
    };

    int main() {
      printf("sizeof(A) = %d\n", sizeof(A));
      return 0;
    }
sizeof(A) = 4

编译运行,查看结果,可以得知默认情况枚举类型占用4个字节。

枚举类型能否负数

  #include <stdio.h>

  enum {
      A = -1,
      B
  };

  int main() {
      printf("A = %d, B = %d\n", A, B);
      return 0;
  }
A = -1, B = 0

其实上面的代并不能完全可靠的推断枚举值支持负数,具体原因和补码有关。那么如何才能确定枚举值是支持负数呢?换种问法就是枚举类型是有有符号的还是无符号的?

这个答案也可以通过编译器得知:

  $ gcc -Wsign-compare enum.c
  enum.c: In function ‘main’:
  enum.c:10:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       if(a < - 1) {
            ^

编译时候指定无符号和有符号数据进行比较时给出警告,可以看出与枚举值比较时并没有告警。

  #include <stdio.h>

    enum {
      A = 1,
      B
    };

    int main() {
      unsigned int a = 1;
      if(a < - 1) {
          printf("unsigned int: Wrong type conversion 1 Less than -1!!!\n");
      } else {
          printf("unsigned int: ok\n");
      } 

      if(A < - 1) {
          printf("enum: Wrong type conversion 1 Less than -1!!!\n");
      } else {
          printf("enum: ok\n");
      } 
      return 0;
    }
unsigned int: Wrong type conversion 1 Less than -1!!!
enum: ok

枚举值超过上限

  #include <stdio.h>
  enum {
    A = 0xffffffff,
    B
  };
  int main() {
    printf("B = %lld\n", B);
    return 0;
  }

编译时候就可以知道这个代码是无法编译通过的,编译会报错。

error: overflow in enumeration values

指定枚举值点用字节

那么在64位机器上如果需要超过4字节上限的枚举值怎么办呢?其实可以在给枚举值赋值时候指定值的类型为 LL

  #include <stdio.h>
  enum {
    A = 0xffffffffLL,
    B
  };
  int main() {
    printf("B = %lld\n", B);
    printf("sizeof(B) = %d\n", sizeof(B));
    return 0;
  }
B = 4294967296
sizeof(B) = 8

总结

实际上关于枚举类型的标准是有符号还是无符号,并没有标准来规定,这是由具体实现决定的。