¿Por qué no puedes comprobar si errno es igual a ERANGE?

He estado tratando de convertir correctamente una matriz de caracteres a un largo constrtol, compruebe si hubo un desbordamiento o un subflujo y luego realice un int intcast a lo largo. En el camino, he notado una gran cantidad de código que se ve así

if ((result == LONG_MAX || result == LONG_MIN) && errno == ERANGE)
{
   // Handle the error
}

¿Por qué no puedes simplemente decir

if(errno == ERANGE)
{
    // Handle the error
}

Según tengo entendido, si se produce un desbordamiento o desbordamiento, errno está configurado en ERANGE en ambos casos. Entonces, ¿es realmente necesario el primero? ¿Podría ser problemático verificar ERANGE solo?

Así es como se ve mi código a partir de ahora

 char *endPtr;
 errno = 0;
 long result = strtol(str, &endPtr, 10);

 if(errno == ERANGE)
 {
     // Handle Error
 }
 else if(result > INT_MAX || result < INT_MIN)
 {
    // Handle Error
 }
 else if(endPtr == str || *endPtr != '\0')
 {
     // Handle Error
 }

 num = (int)result;
 return num;

Si hay una razón para lo primero, avíseme.

Respuestas a la pregunta(2)

Su respuesta a la pregunta