glibc에서 atoi함수의 원형을 보면 이렇습니다.
strtol함수를 통해 문자열을 정수로 바꿔준 후 int로 캐스팅만 하여 리턴합니다.
이 과정에서 LONG_MAX값 이상의 숫자와 LONG_MIN값 이하의 숫자들이 고정이 됩니다.
strtol함수의 man 페이지를 봅시다.
strtol 함수는 LONG_MIN과 LONG_MAX의 값을 넘어가면 오버플로우와 언더플로우가 일어나서 더 이상 변환하지 않습니다. 실제로 더 큰 값을 넣고 함수를 돌려보면 LONG_MIN과 LONG_MAX의 값만 고정되어 출력되는 것을 알 수 있습니다.
결국, atoi함수는 이러한 strtol함수의 결과를 int로 캐스팅하여 반환합니다. 따라서 LONG_MAX를 넘어가는 값은 LONG_MAX를 int로 캐스팅 한 -1이 리턴되고 LONG_MIN을 넘어가는 값은 LONG_MIN을 int로 캐스팅한 0값이 리턴되는 것입니다.