Ответ 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};