* A la hora de escribir código, usa las etiquetas GeSHi, gracias *
If the value read is out of the range of representable values by a long int, the function returns LONG_MAX or LONG_MIN (defined in <climits>), and errno is set to ERANGE.
Dicho en cristiano... si el valor a traducir está fuera de rango, la función devolverá LONG_MAX o LONG_MIN dependiendo de si te has pasado por arriba o por abajo.
En tu caso el valor devuelto es LONG_MAX.
El por qué es sencillo. Long son 32 bits, reservando uno para el signo. El bit de signo es el primero empezando por la izquierda. Si convertimos tu cifra a binario queda:
C 0 0 0 0 0 4 0
1100 0000 0000 0000 00000 0000 1000 0000
El primer bit por la izquierda es uno, es decir, estaría representando a un número negativo... dado que el valor lo has dado en hexadecimal, representando un número positivo, no es posible realizar la conversión... convertir un número positivo en uno negativo no suele quedar bien.
Dado que el número en hexadecimal es positivo, la función te devuelve LONG_MAX.
Si cambias esa C por, como mucho, un 7, la función te devolverá el valor esperado.