Los caracteres y números enteros son más bien estrechamente unidas en C.
Cuando recibe un personaje de un flujo de entrada, debe ser capaz de representar todos los caracteres además el símbolo de fin de archivo.
Eso significa que un tipo char
no será lo suficientemente grande para que utilicen un tipo más ancho.
Los C99, señala el documento justificación:
Dado que estas funciones se utilizan a menudo principalmente como macros, su dominio se limita a los pequeños números enteros positivos representables en un unsigned char, más el valor de EOF. EOF es tradicionalmente -1, pero puede ser cualquier número entero negativo y, por lo tanto, se puede distinguir de cualquier código de carácter válido. Por lo tanto, estas macros se pueden implementar de manera eficiente utilizando el argumento como un índice en una pequeña matriz de atributos.
La norma en sí tiene esto que decir:
La cabecera <ctype.h>
declara varias funciones útiles para la clasificación y mapeo caracteres. En todos los casos, el argumento es un int, cuyo valor debe ser representable como un carácter sin signo o debe ser igual al valor del macro EOF. Si el argumento tiene algún otro valor, el comportamiento no está definido.
Sospecho que la respuesta es similar a la dada [aquí] (http://stackoverflow.com/questions/433895/why-are-c-character-literals-ints-instead-of-chars). En C, los literales de caracteres son del tipo 'int'. –
@Cody: las dos decisiones pueden estar relacionadas, ya que el tipo de datos correcto para hacer "cálculos" en caracteres en C es 'int'. Pero los literales que tienen el mismo tipo que los parámetros de estas funciones no son tan simples como parecen. Puede escribir 'isalnum ('a')', pero no está garantizado que pueda escribir 'isalnum (CHAR_MIN)', o cualquier carácter literal que corresponda a 'CHAR_MIN' en su implementación, porque podría ser negativo.Para coincidir adecuadamente con estas funciones, los literales de caracteres realmente necesitarían escribir 'unsigned', pero luego convertirlos a' char' sería potencialmente malo. –