C :为枚举分配负值?

hen*_*343 5 c enums

背景

我正在尝试将 -1 分配给枚举变量,如下所示:

typedef enum test {
        first,
        second,
}soc_ctr_type_t 

soc_ctr_type_t ctype;

...

switch(type){
   case 1:
       ctype = first;
   break;

   case 2:
      ctype = second;
   break;

   default:
      ctype = -1;
}
Run Code Online (Sandbox Code Playgroud)

如果type是默认情况,ctype则应变为 -1,但事实并非如此。我printf用来调试的时候,ctype是255。

为什么ctype变成 255 而不是 -1?

250*_*501 8

使用枚举器列表中的值定义一个枚举器,结果将是正确的:

typedef enum test {
        minus_one = -1 ,
        first,
        second,
} soc_ctr_type_t;
Run Code Online (Sandbox Code Playgroud)

您看到 255 的原因是因为编译器为此枚举器选择了一个较窄的无符号类型,因为它只能看到first, second,其值为 0、1。因此选择的类型是unsigned char因为它可以表示这两个值。
此类型将从 -1 换行到 255。

C 中的枚举数不是特殊类型,它们由整数类型表示,因此您可以将值分配给枚举数列表中不存在的枚举数。