C ++: предупреждение компилятора для больших целых без знака - PullRequest
19 голосов
/ 28 февраля 2010

У меня есть следующий массив, который мне нужно использовать вручную для растровых изображений.

const unsigned int BITS[32] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 
                               2048, 4096, 8192, 16384, 32768, 65536, 131072, 
                               262144, 524288, 1048576, 2097152, 4194304, 
                               8388608, 16777216, 33554432, 67108864, 134217728, 
                               268435456, 536870912, 1073741824, 2147483648};

К сожалению, при компиляции я получаю

предупреждение: эта десятичная константа не имеет знака только в ISO C90

Как мне это убрать?

Ответы [ 3 ]

19 голосов
/ 28 февраля 2010

Целочисленные литералы в C, по умолчанию, имеют тип «подписанный int» (редактировать: но смотрите комментарии для предостережений). Последнее число слишком велико, чтобы его можно было представить в виде 32-разрядного целого числа со знаком, поэтому вам нужно сообщить компилятору, что это целое число без знака, добавив суффикс «U», например:

2147483648U

Обратите внимание, что вы также можете добавить суффикс "L", чтобы сделать его "длинным", но во многих системах он все еще 32-разрядный и, следовательно, не имеет значения.

Кроме того, существует гораздо менее подверженный ошибкам (и более легкий для чтения) способ написания этого кода с помощью оператора сдвига битов:

const unsigned int BITS[32] = {1U, 1U<<1, 1U<<2, 1U<<3, 1U<<4,
                               /* and so on */
                               1U<<31};

Или писать в шестнадцатеричном формате, если вам по какой-то причине не нравятся битовые сдвиги:

const unsigned int BITS[32] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20,
                               /* and so on */
                               0x80000000U};
7 голосов
/ 28 февраля 2010

Ваша константа также должна быть указана как беззнаковая, используйте

2147483648UL

(UL = Длинная без знака) или просто

2147483648U

для беззнакового целого.

Поскольку ваш код прямо сейчас, константе, которая по умолчанию является простой int и, следовательно, подписана, присваивается unsigned int, который генерирует ваше предупреждение.

1 голос
/ 12 января 2011

Нет необходимости определять тип данных как беззнаковый просто тип;

int variable_name=2147483648U;

иначе просто конвертируйте десятичное значение в шестнадцатеричное ...

...