115 votos

Convertir char a int en C y C++

¿Cómo convierto un char a un int en C y C++?

207voto

Foo Bah Puntos 11566

Depende de lo que quieras hacer:

para leer el valor como un código ascii, puedes escribir

char a = 'a';
int ia = (int)a; 
/* note that the int cast is not necessary -- int ia = a would suffice */

para convertir el personaje '0' -> 0 , '1' -> 1 puedes escribir

char a = '4';
int ia = a - '0';
/* check here if ia is bounded by 0 and 9 */

40voto

Matt Joiner Puntos 29194

Para corregir Sayam Ahmed 's responder a :

C y C++ siempre promueven los tipos a por lo menos int . Además, los caracteres literales son del tipo int en C y char en C++ .

Puedes convertir un char simplemente asignando a un int .

char c = 'a'; // narrowing on C
int a = c;

14voto

Lundin Puntos 21616

char es sólo un entero de 1 byte. ¡No hay nada mágico con el tipo char! Así como puedes asignar un corto a un int, o un int a un largo, puedes asignar un char a un int.

Sí, el nombre del tipo de datos primitivos resulta ser "char", lo que insinúa que sólo debería contener caracteres. Pero en realidad, "char" es sólo un pobre nombre elegido para confundir a todos los que intentan aprender el idioma. Un mejor nombre para él es int8_t, y puedes usar ese nombre en su lugar, si tu compilador sigue el último estándar de C.

Aunque, por supuesto, usted debería usar el tipo char al hacer el manejo de las cuerdas, porque el índice de la tabla ASCII clásica cabe en 1 byte. Tú podría sin embargo, también hacen el manejo de cuerdas con ints regulares, aunque no hay ninguna razón práctica en el mundo real por la que querrías hacer eso. Por ejemplo, el siguiente código funcionará perfectamente:

  int str[] = {'h', 'e', 'l', 'l', 'o', '\0' };

  for(i=0; i<6; i++)
  {
    printf("%c", str[i]);
  }

Tienes que darte cuenta de que los caracteres y las cuerdas son sólo números, como todo lo demás en el ordenador. Cuando escribes 'a' en el código fuente, se preprocesa en el número 97, que es una constante entera.

Así que si escribes una expresión como

char ch = '5';
ch = ch - '0';

esto es en realidad equivalente a

char ch = (int)53;
ch = ch - (int)48;

que luego pasa por las promociones de números enteros en el lenguaje C

ch = (int)ch - (int)48;

y luego truncado a un char para ajustarse al tipo de resultado

ch = (char)( (int)ch - (int)48 );

Hay un montón de cosas sutiles como esto entre líneas, donde char es implícitamente tratado como un int.

9voto

Fred Nurk Puntos 8927

(Esta respuesta se refiere al lado C++ de las cosas, pero el problema de la extensión del signo también existe en C.)

El manejo de los tres tipos de caracteres (firmado, sin firmar y "char") es más delicado de lo que parece a primera vista. Los valores en el rango de 0 a SCHAR_MAX (que es 127 para un char de 8 bits) son fáciles:

char c = somevalue;
signed char sc = c;
unsigned char uc = c;
int n = c;

Pero cuando algún valor está fuera de ese rango, sólo pasar por un char sin firmar te da resultados consistentes para los "mismos" valores de char en los tres tipos:

char c = somevalue;
signed char sc = c;
unsigned char uc = c;
// Might not be true: int(c) == int(sc) and int(c) == int(uc).
int nc = (unsigned char)c;
int nsc = (unsigned char)sc;
int nuc = (unsigned char)uc;
// Always true: nc == nsc and nc == nuc.

Esto es importante cuando se utilizan funciones de <ctype>, como isupper o toupper, debido a la extensión del signo:

char c = negative_char;  // Assuming CHAR_MIN < 0.
int n = c;
bool b = isupper(n);  // Undefined behavior.

Nótese que la conversión a través de int está implícita; esto tiene el mismo UB:

char c = negative_char;
bool b = isupper(c);

Para arreglar esto, pasa a través de char sin firmar, lo que se hace fácilmente envolviendo las funciones <ctype> a través de tipo_seguro :

template<int (&F)(int)>
int safe_ctype(unsigned char c) { return F(c); }

//...
char c = CHAR_MIN;
bool b = safe_ctype<isupper>(c);  // No UB.

std::string s = "value that may contain negative chars; e.g. user input";
std::transform(s.begin(), s.end(), s.begin(), &safe_ctype<toupper>);
// Must wrap toupper to eliminate UB in this case, you can't cast
// to unsigned char because the function is called inside transform.

Esto funciona porque cualquier función que tome cualquiera de los tres tipos de caracteres puede tomar también los otros dos tipos de caracteres. Conduce a dos funciones que pueden manejar cualquiera de los tipos:

int ord(char c) { return (unsigned char)c; }
char chr(int n) {
  assert(0 <= n);  // Or other error-/sanity-checking.
  assert(n <= UCHAR_MAX);
  return (unsigned char)n;
}

// Ord and chr are named to match similar functions in other languages
// and libraries.

Ord(c) siempre te da un valor no negativo - incluso cuando se le pasa un char negativo o un char con signo negativo - y chr toma cualquier valor que ord produce y devuelve exactamente el mismo char.

En la práctica, probablemente me limitaría a echar a través de los caracteres sin firmar en lugar de usar estos, pero envuelven sucintamente el yeso, proporcionan un lugar conveniente para añadir la comprobación de errores para el int-to-char, y sería más corto y más claro cuando usted necesita usarlos varias veces en estrecha proximidad.

5voto

T.E.D. Puntos 26829

Depende de lo que quieras decir con "convertir".

Si tienes una serie de personajes que representan un entero, como "123456", entonces hay dos maneras típicas de hacerlo en C: Usar una conversión de propósito especial como atoi() o strtol() o el propósito general sscanf() . C++ (que en realidad es un lenguaje diferente disfrazado de actualización) añade un tercero, el stringstreams.

Si te refieres a que quieres el patrón de bits exacto en uno de tus int variables que deben ser tratadas como una char Eso es más fácil. En C, los diferentes tipos de números enteros son realmente más un estado mental que "tipos" separados. Simplemente empieza a usarlo donde char que se piden, y deberías estar bien. Puede que necesites una conversión explícita para que el compilador deje de quejarse en ocasiones, pero todo lo que debería hacer es dejar caer cualquier bit extra más allá de 256.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X