Diferencia entre char y int al declarar carácter.

Acabo de empezar a aprender C y estoy bastante confundido sobre la statement de caracteres usando int y char.

Soy consciente de que cualquier carácter está formado por enteros en el sentido de que los “enteros” de los caracteres son los decimales ASCII respectivos de los caracteres.

Dicho esto, aprendí que es perfectamente posible declarar un carácter usando int sin usar los decimales ASCII. P.ej. declarar la test variables como un carácter 'X' se puede escribir como:

 char test = 'X'; 

y

 int test = 'X'; 

Y para ambas declaraciones de caracteres, los caracteres de conversión son %c (aunque la prueba se define como int ).

Por lo tanto, mi pregunta es / ¿cuál es la diferencia (s) entre declarar variables de caracteres utilizando char y int y cuándo usar int para declarar una variable de carácter?

La diferencia es el tamaño en bytes de la variable, y desde allí los diferentes valores que la variable puede contener.

Se requiere un carácter para aceptar todos los valores entre 0 y 127 (incluidos). Así que en entornos comunes ocupa exactamente un byte (8 bits). No está especificado por el estándar si está firmado (-128 – 127) o sin firmar (0 – 255).

Se requiere que un int sea al menos una palabra con signo de 16 bits, y que acepte todos los valores entre -32767 y 32767. Eso significa que un int puede aceptar todos los valores de un carácter, ya sea este último firmado o sin signo.

Si desea almacenar solo caracteres en una variable, debe declararlo como char . El uso de un int solo desperdiciaría la memoria y podría engañar a un futuro lector. Una excepción común a esa regla es cuando desea procesar un valor más amplio para condiciones especiales. Por ejemplo, la función fgetc de la biblioteca estándar se declara como int retorno:

 int fgetc(FILE *fd); 

porque el valor especial EOF (para Fin de archivo) se define como el valor int -1 (todos los bits a uno en un sistema de 2 complementos) que significa más que el tamaño de un carácter. De esa manera, ningún char (solo 8 bits en un sistema común) puede ser igual a la constante EOF. Si se declara que la función devuelve un char simple, nada podría distinguir el valor EOF del carácter (válido) 0xFF.

Esa es la razón por la cual el siguiente código es malo y nunca debe usarse:

 char c; // a terrible memory saving... ... while ((c = fgetc(stdin)) != EOF) { // NEVER WRITE THAT!!! ... } 

Dentro del bucle, un char sería suficiente, pero para que la prueba no tenga éxito al leer el carácter 0xFF, la variable debe ser un int.

El tipo char tiene múltiples roles.

La primera es que es simplemente parte de la cadena de tipos enteros, char , short , int , long , etc., así que es solo otro contenedor de números.

La segunda es que su almacenamiento subyacente es la unidad más pequeña, y todos los demás objetos tienen un tamaño que es un múltiplo del tamaño de char ( sizeof devuelve un número que está en unidades de char , así que sizeof char == 1 ).

La tercera es que desempeña el papel de un personaje en una cadena, sin duda históricamente. Cuando se ve de esta manera, el valor de un char asigna a un carácter específico, por ejemplo, a través de la encoding ASCII, pero también se puede usar con codificaciones de múltiples bytes (uno o más caracteres se asignan a un solo carácter).

Por lo general, debe declarar los caracteres como char y usar int para que los enteros sean capaces de mantener valores más grandes. En la mayoría de los sistemas, un char ocupa un byte que es de 8 bits. Dependiendo de su sistema, este carácter puede estar firmado o sin firmar de forma predeterminada, por lo que podrá mantener valores entre 0-255 o -128-127.

Un int puede tener una longitud de 32 bits, pero si realmente desea exactamente 32 bits para su entero, debe declararlo como int32_t o uint32_t en su lugar.

El tamaño de un int es de 4 bytes en la mayoría de las architectures, mientras que el tamaño de un char es de 1 byte.

Creo que no hay diferencia, pero estás asignando memoria extra que no vas a usar. También puedes hacer const long a = 1; , pero será más adecuado usar const char a = 1; en lugar.