Целочисленные литералы в 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};