Программа неверна, поскольку переполняет со знаком int, что является неопределенным поведением в C. В некоторых средах приведет к бесконечному циклу, но многие компиляторы реализуют переполнение со знаком так же, как они реализуют беззнаковоепереполнение.
В случае, если переполнение со знаком реализовано как переполнение без знака, в какой-то момент i
станет слишком большим, чтобы поместиться в короткое, и обернется вокруг и станет 0 - что сломаетсяпетля.В основном USHRT_MAX + 1
дает 0.
Так что измените i
на unsigned short i = 0
, и все будет хорошо.