Когда вы сдвигаете int вправо, он заполняется битом знака, потому что он подписан.Итак, 0x80000000 >> 1 - это 0xc0000000;>> 2 - это 0xe0000000;>> 23 - это 0xffffffff;>> 31 равно 0xffffffff.
Значение 10 является двоичным 1010, поэтому оно равно нулю для каждого i в 28,29,30,31.Вы можете проверить это, изменив вашу программу, чтобы попробовать разные цифры:
4: 00000000000000000000000000000111
8: 00000000000000000000000000000111
15:00000000000000000000000000001111
16:00000000000000000000000000011111
Как отмечается в комментариях, если вы переключитесь на unsigned, этого не произойдет.
ps: Это полностьювозможно, что изменение подписи было переопределено как неопределенное поведение, и в этом случае вам повезло, что ваш дом не сгорел.