2012-04-23 3 views
0

Как установить/отключить значение перечисления для чего-то вроде следующего. Использование 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 

эквивалентны

o = o & ~FOUR 

На РИТ, o это беззнаковое целочисленное значение и ~FOUR подписан 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 байт, один для завершающего нуля. Сделайте это static char b[10]; и все works fine

Смежные вопросы