Convertir char a int en C y C++

10 minutos de lectura

Convertir char a int en C y C
principaljaved

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

  • @ Matt: sería una buena idea ser más concreto. preguntar sobre una generalización solo invita a respuestas generalizadas que son no aplica o incluso corregir para su tarea. tenga en cuenta que, cuando tenga que preguntar, es probable que no sepa lo suficiente como para generalizar correctamente.

    – Saludos y hth. – alf

    17 de febrero de 2011 a las 14:18

  • @Alf P. Steinbach: La pregunta original era vaga con respecto a qué idioma. con palabras clave c y c++creo que las respuestas que confrontan ambos idiomas son razonables.

    – Matt Carpintero

    17 de febrero de 2011 a las 14:25

  • De mi amplia experiencia en otros foros técnicos, mi intuición es que el OP De Verdad significa “¿cómo tomo la representación textual de un número (en base 10) y la convierto al número correspondiente?” En términos generales, los neófitos de C y C++ suelen tener increíblemente ideas confusas sobre cómo funciona el texto en esos idiomas y qué char realmente significa.

    – Karl Knechtel

    17 de febrero de 2011 a las 15:56

  • @KarlKnechtel: si eso es cierto (le doy alrededor de 50/50 ya que muchos de los primeros tutoriales también alientan a obtener valores ASCII de los caracteres, aunque ASCII no cubre el rango completo), el OP necesita claridad, pero eso es un engaño de stackoverflow.com/questions/439573/….

    – Fred Nurk

    17 de febrero de 2011 a las 16:51


  • El OP tuvo tres horas para aclarar esta pregunta y no lo hizo. Tal como están las cosas, no hay forma de saber qué se pregunta realmente. Votado para cerrar.

    – sbi

    17 de febrero de 2011 a las 17:27

1647568028 780 Convertir char a int en C y C
foo-bah

Depende de lo que quieras hacer:

para leer el valor como un código ascii, puede 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' -> 1etc., puedes escribir

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

Explicación:
a - '0' es equivalente a ((int)a) - ((int)'0'), lo que significa que los valores ascii de los caracteres se restan entre sí. Ya que 0 viene directamente antes 1 en la tabla ascii (y así sucesivamente hasta 9), la diferencia entre los dos da el número que el carácter a representa.

  • @KshitijBanerjee Esa no es una buena idea por dos razones: le da un número negativo para los caracteres ASCII antes de ‘0’ (como & -> -10), y te da números mayores que 10 (como x -> 26)

    – HojaJS

    28 de diciembre de 2014 a las 18:14

  • int ia = a – ‘0’ – eso es lo que necesitas

    – funk

    5 mayo 2015 a las 21:27


  • @ kevin001 Si desea convertir el carácter a int y un carácter '1' proporciona un número ascii que no es 1es necesario eliminar el desplazamiento '0' para realinearlo para contar de 0-9. Los números consecutivos del 1 al 9 son adyacentes en el número entero ascii.

    – krisdestrucción

    9 oct 2015 a las 17:36


  • No se requiere / desea ningún elenco

    –Craig Estey

    11/10/2015 a las 22:14

  • @ foo-bah Pero no entendí por qué tenemos que restarlo con el carácter ‘0’, si solo encasillamos ese carácter en un número entero y lo almacenamos en un número entero, ¿por qué arroja un error?

    – Srijoy_paul

    31 de marzo de 2021 a las 12:22

Convertir char a int en C y C
Vlad Isoc

Bueno, en código ASCII, los números (dígitos) comienzan desde 48. Todo lo que necesitas hacer es:

int x = (int)character - 48;

O, dado que el personaje ‘0’ tiene el código ASCII de 48, solo puedes escribir:

int x = character - '0';  // The (int) cast is not necessary.

Convertir char a int en C y C
carpintero mate

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

Puedes convertir un char escriba simplemente asignando a un int.

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

  • También podría usar el muy poco apreciado unario operator+() para este propósito.

    – Cubbi

    17 de febrero de 2011 a las 14:14


  • -1 La respuesta es incorrecta para la única interpretación significativa de la pregunta. este (código int a = c;) mantendrá los valores negativos, que las funciones de biblioteca estándar de C no pueden manejar. Las funciones de la biblioteca estándar de C establecen el estándar de lo que significa manejar char valores como int.

    – Saludos y hth. – alf

    17 de febrero de 2011 a las 14:14


  • @Matt: Me quedo con el voto negativo. ¡Lo fortalecería si es posible! La interpretación de la pregunta que usted y otros han asumido no es significativa, porque es demasiado trivial y porque para la combinación particular de tipos del OP hay un problema práctico muy importante no tan trivial. El consejo que das es directamente peligroso al novato. Lo más probable es que resulte en Comportamiento indefinido para sus programas que usan funciones de clasificación de caracteres de la biblioteca estándar de C. ref. a la respuesta de @ Sayam, ha eliminado esa respuesta.

    – Saludos y hth. – alf

    17 de febrero de 2011 a las 15:22

  • -1 por ser incorrecto: isupper() tendrá resultados indefinidos si se le pasa un carácter de bit alto de 1252.

    – Chris Becke

    17 de febrero de 2011 a las 15:34

  • ¿A qué te refieres con “promocionar siempre”? Los valores se promueven durante las conversiones implícitas, ciertos tipos de parámetros que pasan (por ejemplo, a una función varargs) y cuando un operador debe hacer que sus operandos sean tipos compatibles. Pero ciertamente hay ocasiones en las que un valor no se promueve (como si paso un carácter a una función que espera un carácter), de lo contrario no tendríamos ningún tipo más pequeño que un int.

    – Adrián McCarthy

    18 mayo 2013 a las 19:44

1647568030 407 Convertir char a int en C y C
Lundin

char es solo un entero de 1 byte. ¡No hay nada mágico con el tipo char! Así como puedes asignar un short a un int o un int a un long, puedes asignar un char a un int.

Sí, el nombre del tipo de datos primitivo resulta ser “char”, lo que insinúa que solo debe contener caracteres. Pero en realidad, “char” es solo una mala elección de nombre para confundir a todos los que intentan aprender el idioma. Un mejor nombre para él es int8_t, y puede usar ese nombre en su lugar, si su compilador sigue el último estándar C.

Aunque por supuesto tu deberían use el tipo char cuando maneje cadenas, porque el índice de la tabla ASCII clásica cabe en 1 byte. Tú pudo sin embargo, también maneje cadenas con ints regulares, aunque no hay ninguna razón práctica en el mundo real por la que quiera 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 cadenas son solo números, como todo lo demás en la computadora. Cuando escribe ‘a’ en el código fuente, se procesa previamente 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 enteros del lenguaje C

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

y luego truncado a un carácter para ajustarse al tipo de resultado

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

Hay muchas cosas sutiles como esta entre líneas, donde char se trata implícitamente como un int.

1647568030 719 Convertir char a int en C y C
fred nurk

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

Manejo de los tres char tipos (signed, unsignedy char) es más delicada de lo que parece a primera vista. Valores en el rango de 0 a SCHAR_MAX (que es 127 para un 8 bits char) son fáciles:

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

Pero cuando somevalue está fuera de ese rango, solo pasa por unsigned char le da resultados consistentes para el “mismo” char valores 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 tipoc.htal como isupper o toupperdebido a la extensión del signo:

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

Tenga en cuenta que la conversión a través de int es implícita; esto tiene el mismo UB:

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

Para arreglar esto, vaya a través de unsigned charque se hace fácilmente envolviendo tipoc.h funciones 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 también puede tomar 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 le da un valor no negativo, incluso cuando pasa un negativo char o negativo signed char – y chr toma cualquier valor ord produce y devuelve exactamente lo mismo char.

En la práctica, probablemente solo lanzaría unsigned char en lugar de usar estos, pero envuelven sucintamente el yeso, brindan un lugar conveniente para agregar la verificación de errores para int-para-chary sería más corto y más claro cuando necesite usarlos varias veces muy cerca.

1647568031 685 Convertir char a int en C y C
Comunidad

Utilizar static_cast<int>:

int num = static_cast<int>(letter); // if letter="a", num=97

Editar: Probablemente deberías tratar de evitar usar (int)

int num = (int) letra;

consulte ¿Por qué usar static_cast(x) en lugar de (int)x? para más información.

tengo absolutamente null habilidades en C, pero para un análisis simple:

char* something = "123456";

int number = parseInt(something);

… esto funcionó para mí:

int parseInt(char* chars)
{
    int sum = 0;
    int len = strlen(chars);
    for (int x = 0; x < len; x++)
    {
        int n = chars[len - (x + 1)] - '0';
        sum = sum + powInt(n, x);
    }
    return sum;
}

int powInt(int x, int y)
{
    for (int i = 0; i < y; i++)
    {
        x *= 10;
    }
    return x;
}

  • Este código invoca rápidamente un comportamiento indefinido y, por lo tanto, no es adecuado para copiar y pegar. (desbordamiento int)

    – Roland Illig

    31/03/2018 a las 20:25

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad