2012-04-23 10 views
0

다음과 같은 방법으로 enum 값을 설정/해제하는 방법은 무엇입니까? GCC를 사용하여,이 성가신 경고를 얻을 :암시 적으로 암시 적으로 부호가없는 형식으로 변환 된

test.c:37: warning: negative integer implicitly converted to unsigned type 
test.c:39: warning: negative integer implicitly converted to unsigned type 
test.c:41: warning: negative integer implicitly converted to unsigned type 
test.c:43: warning: negative integer implicitly converted to unsigned type 

코드는 : 당신의 열거 어떤 음의 정수 상수를 포함하지 않기 때문에

#include <stdio.h> 
#include <string.h> 

typedef enum { 
ONE = 0x1, 
TWO = 0x2, 
THREE = 0x4, 
FOUR = 0x8, 
} options; 

static const char *byte_to_binary (int x) 
{ 
    int z; 
    static char b[9]; 
    b[0] = '\0'; 

    for (z = 256; z > 0; z >>= 1) 
    { 
    strcat(b, ((x & z) == z) ? "1" : "0"); 
    } 

    return b; 
} 

int main(int argc, char *argv[]) 
{ 
    options o = 0; 
    printf("%s\n", byte_to_binary(o)); 
    o |= ONE; 
    printf("%s\n", byte_to_binary(o)); 
    o |= TWO; 
    printf("%s\n", byte_to_binary(o)); 
    o |= THREE; 
    printf("%s\n", byte_to_binary(o)); 
    o |= FOUR; 
    printf("%s\n", byte_to_binary(o)); 
    o &= ~FOUR; 
    printf("%s\n", byte_to_binary(o)); 
    o &= ~THREE; 
    printf("%s\n", byte_to_binary(o)); 
    o &= ~TWO; 
    printf("%s\n", byte_to_binary(o)); 
    o &= ~ONE; 
    printf("%s\n", byte_to_binary(o)); 

    return 0; 
} 
+1

줄 번호를 표시하십시오. –

+0

도움이 될 수 있습니다. http://stackoverflow.com/questions/2579230/signedness-of-enum-in-c-c99-c-cx-gnu-c-gnu-c99 – bmartins

답변

6

, 나는 GCC는 당신의 열거에 unsigned INT 유형을 주신 것 같아요. 이제

o &= ~FOUR 

같은 표현은 RHS에

o = o & ~FOUR 

에 동일, o가 INT 서명하고 ~FOUR는 INT와 타입 변환 규칙에 의해 서명되어, INT는 부호없는 INT로 변환됩니다 서명했다. 또한 ~FOUR은 음수이므로 음수를 부호없는 유형으로 암시 적으로 변환하면 경고 메시지가 나타납니다.

로직에 대해 확신이 있다면 경고에 대해 걱정할 필요가 없으며 음수와 같은 더미 enum을 사용하여 열거 형을 부호로 변환 할 수 있습니다.

typedef enum { 
DUMMY =-1, 
ONE = 0x1, 
TWO = 0x2, 
THREE = 0x4, 
FOUR = 0x8, 
} options; 

같은

뭔가 또한, 코드는 런타임있다 buffer overflow problems합니다. 함수 byte_to_binary에서는 9 비트를 검사하지만 버퍼도 9 바이트입니다. 그것은 10 바이트, 하나의 null을 종료해야합니다. 확인하십시오 static char b[10]; 및 모든 것 works fine

관련 문제