Ints подписываются по умолчанию, что обычно означает, что старший бит зарезервирован для указания, является ли целое число отрицательным или нет.Посмотрите дополнение к двум для объяснения того, как это работает.
Вот результат:
[steven@sexy:~]% cat test.c
#include <stdint.h>
#include <stdio.h>
int main(int argc, char **argv[]) {
uint32_t uint;
int32_t sint;
int64_t slong;
uint = (((uint32_t)1)<<31) >> 31;
sint = (1<<31) >> 31;
slong = (1L << 31) >> 31;
printf("signed 32 = %d, unsigned 32 = %u, signed 64 = %ld\n", sint, uint, slong);
}
[steven@sexy:~]% ./test
signed 32 = -1, unsigned 32 = 1, signed 64 = 1
Обратите внимание, как вы можете избежать этой проблемы, либо используя "unsigned""int (допускает использование всех 32 битов) или переход к большему типу, который вы не переполняете.