Подтвердить что ты не робот

С++: предупреждение компилятора для большого unsigned int

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

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

Как я могу удалить это?

4b9b3361

Ответ 1

Целочисленные литералы в C по умолчанию имеют тип "signed 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};

Ответ 2

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

2147483648UL

(UL = Unsigned Long) или просто

2147483648U

для unsigned int.

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

Ответ 3

Не нужно определять тип данных как беззнаковый тип,

int variable_name=2147483648U;

else просто преобразует десятичное значение в hex...