【C言語】
enumは
符号付き(signed)か?
符号無し(unsigned)か?

enumの符号

warning: result of comparison of unsigned enum expression < 0 is always false

警告:unsigned enum 式 < 0 の比較結果は常に偽である。
[-Wtautological-unsigned-enum-zero-compare]

■enumのメンバーに負値が無いと符号無し(unsigned)

#include    <stdio.h>
typedef enum {
    A=0,//符号なしになる
    B,
    C}  
typeA ;//負値無しのenum型

int main(void){
    typeA  x = -1;
    if(x >= 0){
        puts("符号なし!こちらが表示されます");
    }else{
        puts("符号付き");
    }
}

enum型はメンバ内の負値の有無に応じて
符号付きになったり、
符号無しになったりします。

enumのメンバに負値がない場合
enumの型はgcc,clangでは
type A xは
符号無しになりました。
このためxは負値にならないのでif文は成立します。

■enumのメンバーに負値が有ると符号付き(signed)

#include    <stdio.h>
typedef enum {
    A=-1,//符号付きになる
    B,
    C}  
typeA ;//負値ありのenum型

int main(void){
    typeA  x = -1;
    if(x >= 0){
        puts("符号なし");
    }else{
        puts("符号付き!こちらが表示されます");
    }
}

enumのメンバに負値がある場合
enumの型はgcc,clangでは
type A xは
符号付きになりました。
このためxは負値になるのでif文は成立しません。

■注意:この警告は-Wallに含まれません

この警告は現在 gcc では出ません。
clang の-Wallにも含まれず
-Wtautological-unsigned-enum-zero-compare 
オプションで出ます。

参考:

INT09-C. 列挙定数が一意の値に対応することを保証する