Diferencia entre revisiones de «char»

De ArduWiki
Saltar a: navegación, buscar
(Vea también)
(Referencias)
 
(No se muestran 45 ediciones intermedias de 2 usuarios)
Línea 1: Línea 1:
 
== Descripción ==
 
== Descripción ==
Un '''char''' es un tipo de dato que normalmente se usa para almacenar caracteres. A diferencia de otros lenguajes, en Arduino (C++) ocupa 8 bits (1 byte); lo que provoca que, en muchas situaciones, '''char''' y [[byte]] sean lo mismo.
+
Un '''char''' (caracter) es el tipo de dato mas pequeño para el almacenamiento de números en Arduino porque almacena un valor de 1 byte (8 bit). Esto produce un rango de -128 (-2^7) a 127 (2^7-1).  
  
Es de 8 bits con signo, lo cual significa que comprende el rango de valores de -128 a 127. Un caracter, para efectos computacionales, en realidad es un número entero; y su relación símbolo-valor la podemos encontrar en la llamada [https://es.wikipedia.org/wiki/ASCII#Caracteres_imprimibles_ASCII Tabla ASCII]. Es más, es posible realizar operaciones matemáticas sobre caracteres individuales debido a la razón anterior; pudiendo resultar en otro caracter.
+
Mucha gente asocia, quizas por su nombre, que este tipo de datos solo almacena un carácter como tal. Eso es cierto, pero olvida que la logica digital solo conoce de unos y ceros, por lo que en realidad lo que almacena es el código ASCCI de dicho caracter. Cada caracter esta representado por un número entero; y su relación símbolo-valor la podemos encontrar en la llamada [https://es.wikipedia.org/wiki/ASCII#Caracteres_imprimibles_ASCII Tabla ASCII].  
 +
 
 +
Es más, es posible realizar operaciones matemáticas sobre caracteres individuales debido a la razón anterior; pudiendo resultar en otro carácter. Ver ejemplo 4.
  
 
== Sintaxis ==
 
== Sintaxis ==
Línea 11: Línea 13:
 
== Parametros ==
 
== Parametros ==
 
;variable: nombre de la variable.
 
;variable: nombre de la variable.
;valor: normalmente suele ser un carácter entre comillas simples. Parámetro opcional.
+
;valor: puede ser un numero en el rango, aunque normalmente suele ser un carácter entre comillas simples y lo que se almacena es su valor ASCII. Parámetro opcional.
 +
 
 +
{| class="wikitable col2cen"
 +
|+Posibles formateadores
 +
!Base!!Prefijo!!Comentario!!Ejemplo
 +
|-
 +
|DEC||ninguno||Dígitos 0~9||123
 +
|-
 +
|HEX||0x||dígitos 0~9 + Caracteres A~F||0x7B
 +
|-
 +
|OCT||0||digitos 0~7||0173
 +
|-
 +
|BIN||B||0 o 1||B1110011
 +
|}
  
 
== Advertencias ==
 
== Advertencias ==
 
* No es lo mismo asignar un valor entero que un caracter. '''Por ejemplo:''' 1 no es lo mismo que '1' ya que, según la tabla ASCII, este último en realidad equivale a 49. Sin embargo, ambos pueden convivir para ciertas funciones; como obtener el carácter que representa la unidad de un número entero:
 
* No es lo mismo asignar un valor entero que un caracter. '''Por ejemplo:''' 1 no es lo mismo que '1' ya que, según la tabla ASCII, este último en realidad equivale a 49. Sin embargo, ambos pueden convivir para ciertas funciones; como obtener el carácter que representa la unidad de un número entero:
<pre>
+
<syntaxhighlight lang="c++">
 
int valor = 536;
 
int valor = 536;
 
char unidad = '0' + (valor % 10);
 
char unidad = '0' + (valor % 10);
 
// A partir de aquí debería de tener asignado el caracter '6'
 
// A partir de aquí debería de tener asignado el caracter '6'
</pre>
+
</syntaxhighlight>
 +
 
 +
* Si sumas 1 al valor maximo que de 127 pasa a -128.
 +
* Si restas 1 al valor minimo que de -128 pasa a 127.
  
 +
== Comentarios ==
 
* Solamente los caracteres ASCII están estandarizados en todas las regiones del mundo y librerías para Arduino; la codificación del rango extendido (la parte negativa del '''char''' o la que va de 128 a 255) suele variar según la implementación. Un típico ejemplo es el problema de imprimir la 'ñ' en el monitor serial, o imprimir el símbolo de grados ('°') en un LCD de caracteres; ambos están en la parte extendida, por eso puede darnos resultados inesperados. Es también por esta razón que si encontramos código con literales (cadenas de caracteres) de un idioma que no utiliza las letras del alfabeto latino (como el ruso o japonés), al imprimirlos en el monitor serial, nos aparece como "basura".
 
* Solamente los caracteres ASCII están estandarizados en todas las regiones del mundo y librerías para Arduino; la codificación del rango extendido (la parte negativa del '''char''' o la que va de 128 a 255) suele variar según la implementación. Un típico ejemplo es el problema de imprimir la 'ñ' en el monitor serial, o imprimir el símbolo de grados ('°') en un LCD de caracteres; ambos están en la parte extendida, por eso puede darnos resultados inesperados. Es también por esta razón que si encontramos código con literales (cadenas de caracteres) de un idioma que no utiliza las letras del alfabeto latino (como el ruso o japonés), al imprimirlos en el monitor serial, nos aparece como "basura".
 +
* Hay que notar el [[Serial.print()]] trata de manera diferente a '''char''' que otros tipos como: [[byte]], [[int]], [[float]], etc
  
 
== Ejemplo 1 ==
 
== Ejemplo 1 ==
 +
En todos los casos la variable '''caracter'' tomara el mismo valor.
 +
 +
<syntaxhighlight lang="c++">
 +
char caracter = 'A';
 +
char caracter = 65;        //DEC
 +
char caracter = 0x41;      //HEX
 +
char caracter = 0101;      //OCT
 +
char caracter = B1000001;  //BIN
 +
</syntaxhighlight>
 +
 +
# Si revisas la [[ASCII table|tabla ASCII]], habrás notado que sigue siendo la misma asignación. Recuerda que para asignar caracteres individuales, estos deben estar entre '''comillas simples'''.
 
# Es un dato de número decimal entero; por lo tanto esta asignación es válida.
 
# Es un dato de número decimal entero; por lo tanto esta asignación es válida.
 
# Es la misma asignación que el anterior, solo que el valor es hexadecimal. Puede ser útil ya que algunas veces nos dan la tabla con valores en hexadecimal.
 
# Es la misma asignación que el anterior, solo que el valor es hexadecimal. Puede ser útil ya que algunas veces nos dan la tabla con valores en hexadecimal.
# Si revisas la tabla, habrás notado que sigue siendo la misma asignación. Recuerda que para asignar caracteres individuales, estos deben estar entre comillas simples.
+
# Es la misma asignación que el anterior, solo que el valor es octal.
<pre>
+
# Es la misma asignación que el anterior, solo que el valor es binario.
char caracter = 65;
 
char caracter = 0x41;
 
char caracter = 'A';
 
// Todos tienen el mismo valor a fin de cuentas
 
</pre>
 
  
 
== Ejemplo 2 ==
 
== Ejemplo 2 ==
* Lo que se encierra entre comillas dobles se conoce como un literal; que básicamente es una matriz o vector de caracteres (en especial por los <nowiki>[]</nowiki> en el nombre de la variable).
+
Asignacion multiple.
<pre>
+
 
 +
<syntaxhighlight lang="c++">
 +
char x, y, z = 12;            //Error, x e y están declaradas pero no inicializadas.
 +
char x = 'A',y = 12,z = 'Z';  //Ok
 +
</syntaxhighlight>
 +
 
 +
== Ejemplo 3 ==
 +
Lo que se encierra entre '''comillas dobles''' se conoce como un literal; que básicamente es una matriz (array en ingles) o vector de caracteres (en especial por los <nowiki>[]</nowiki> en el nombre de la variable).
 +
 
 +
<syntaxhighlight lang="c++">
 
char texto[] = "Hola mundo de Arduino!";
 
char texto[] = "Hola mundo de Arduino!";
</pre>
+
</syntaxhighlight>
 +
 
 +
== Ejemplo 4 ==
 +
Este ejemplo muestra como encendemos el LED a bordo enviando desde el monitor serie la letra '''e''' y lo apagas con la letra '''a'''.
 +
 
 +
<syntaxhighlight lang="c++">
 +
void setup(){
 +
  pinMode(LED_BUILTIN, OUTPUT);
 +
}
 +
void loop(){
 +
  if (Serial.available()) {
 +
      char entrada = Serial.read();
 +
      if (entrada == 'e'){
 +
        digitalWrite(LED_BUILTIN, HIGH);  //Enciende LED
 +
      }else if (entrada == 'a'){
 +
        digitalWrite(LED_BUILTIN, LOW);  //Apaga LED
 +
      }
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 
 +
== Ejemplo 5 ==
 +
Si te preguntas si el tipo '''char''' acepta negativos aquí la demostración.
 +
<syntaxhighlight lang="c++">
 +
void setup() {
 +
  Serial.begin(115200);
 +
}
 +
 
 +
void loop() {
 +
  if (Serial.available()) {
 +
      char c = Serial.read();
 +
      Serial.print("Enviaste: ");
 +
      Serial.writen(c);          //Muestra la letra
 +
      Serial.println(c, DEC);
 +
      c = c - 80;
 +
      Serial.print("Queda: ");
 +
      Serial.println(c, DEC);
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 
 +
== Ejemplo 6 ==
 +
En este ejemplo hacemos la variable char igual a un '''numero'''. El monitor serie solo puede interpretar los caracteres entre 33~126.
 +
 
 +
<syntaxhighlight lang="c++">
 +
void setup() {
 +
  Serial.begin(115000);
 +
  Serial.println("Mapa tabla ASCII:");
 +
  for (char c=33; c<=126; c++){
 +
      Serial.print(c);          //Imprime el carácter
 +
      Serial.print(", dec: ");
 +
      Serial.print(c, DEC);    //Imprime su valor ASCII decimal
 +
      delay(100);
 +
  }
 +
}
 +
void loop() {
 +
  //Nada
 +
}
 +
</syntaxhighlight>
 +
 
 +
{{Nota|Si usas [[byte]], [[int]], [[float]], etc en lugar de '''char''' debes reemplazar el primer Serial.print() por Serial.write().}}
 +
 
 +
== Ejemplo 7 ==
 +
En este ejemplo hacemos la variable char igual a un '''caracter'''.
 +
 
 +
<syntaxhighlight lang="c++">
 +
void setup() {
 +
  Serial.begin(115000);
 +
  Serial.println("Letras mayusculas:");
 +
  for (char c='A'; c<='Z'; c++){
 +
      Serial.print(c);            //Imprime el carácter
 +
      Serial.print(", dec: ");
 +
      Serial.println(c,DEC);      //Imprime su valor ASCII decimal
 +
      delay(100);
 +
  }
 +
}
 +
void loop() {
 +
  //Nada
 +
}
 +
</syntaxhighlight>
  
 
== Vea también ==
 
== Vea también ==
* [[byte]]
+
<categorytree mode=all>Tipo dato</categorytree>
* [[string]] - matriz de caracteres
 
* [[String]] - clase
 
  
 
== Referencias ==
 
== Referencias ==
 
* [https://www.arduino.cc/reference/es/language/variables/data-types/char/ Guia de referencia de Arduino]
 
* [https://www.arduino.cc/reference/es/language/variables/data-types/char/ Guia de referencia de Arduino]
  
[[Category:Variables]]
+
[[Category:Tipo dato]]

Revisión actual del 18:38 6 may 2019

Descripción

Un char (caracter) es el tipo de dato mas pequeño para el almacenamiento de números en Arduino porque almacena un valor de 1 byte (8 bit). Esto produce un rango de -128 (-2^7) a 127 (2^7-1).

Mucha gente asocia, quizas por su nombre, que este tipo de datos solo almacena un carácter como tal. Eso es cierto, pero olvida que la logica digital solo conoce de unos y ceros, por lo que en realidad lo que almacena es el código ASCCI de dicho caracter. Cada caracter esta representado por un número entero; y su relación símbolo-valor la podemos encontrar en la llamada Tabla ASCII.

Es más, es posible realizar operaciones matemáticas sobre caracteres individuales debido a la razón anterior; pudiendo resultar en otro carácter. Ver ejemplo 4.

Sintaxis

char variable [= valor]:

Parametros

variable
nombre de la variable.
valor
puede ser un numero en el rango, aunque normalmente suele ser un carácter entre comillas simples y lo que se almacena es su valor ASCII. Parámetro opcional.
Posibles formateadores
Base Prefijo Comentario Ejemplo
DEC ninguno Dígitos 0~9 123
HEX 0x dígitos 0~9 + Caracteres A~F 0x7B
OCT 0 digitos 0~7 0173
BIN B 0 o 1 B1110011

Advertencias

  • No es lo mismo asignar un valor entero que un caracter. Por ejemplo: 1 no es lo mismo que '1' ya que, según la tabla ASCII, este último en realidad equivale a 49. Sin embargo, ambos pueden convivir para ciertas funciones; como obtener el carácter que representa la unidad de un número entero:
int valor = 536;
char unidad = '0' + (valor % 10);
// A partir de aquí debería de tener asignado el caracter '6'
  • Si sumas 1 al valor maximo que de 127 pasa a -128.
  • Si restas 1 al valor minimo que de -128 pasa a 127.

Comentarios

  • Solamente los caracteres ASCII están estandarizados en todas las regiones del mundo y librerías para Arduino; la codificación del rango extendido (la parte negativa del char o la que va de 128 a 255) suele variar según la implementación. Un típico ejemplo es el problema de imprimir la 'ñ' en el monitor serial, o imprimir el símbolo de grados ('°') en un LCD de caracteres; ambos están en la parte extendida, por eso puede darnos resultados inesperados. Es también por esta razón que si encontramos código con literales (cadenas de caracteres) de un idioma que no utiliza las letras del alfabeto latino (como el ruso o japonés), al imprimirlos en el monitor serial, nos aparece como "basura".
  • Hay que notar el Serial.print() trata de manera diferente a char que otros tipos como: byte, int, float, etc

Ejemplo 1

En todos los casos la variable 'caracter tomara el mismo valor.

char caracter = 'A';
char caracter = 65;        //DEC
char caracter = 0x41;      //HEX
char caracter = 0101;      //OCT
char caracter = B1000001;  //BIN
  1. Si revisas la tabla ASCII, habrás notado que sigue siendo la misma asignación. Recuerda que para asignar caracteres individuales, estos deben estar entre comillas simples.
  2. Es un dato de número decimal entero; por lo tanto esta asignación es válida.
  3. Es la misma asignación que el anterior, solo que el valor es hexadecimal. Puede ser útil ya que algunas veces nos dan la tabla con valores en hexadecimal.
  4. Es la misma asignación que el anterior, solo que el valor es octal.
  5. Es la misma asignación que el anterior, solo que el valor es binario.

Ejemplo 2

Asignacion multiple.

char x, y, z = 12;             //Error, x e y están declaradas pero no inicializadas.
char x = 'A',y = 12,z = 'Z';   //Ok

Ejemplo 3

Lo que se encierra entre comillas dobles se conoce como un literal; que básicamente es una matriz (array en ingles) o vector de caracteres (en especial por los [] en el nombre de la variable).

char texto[] = "Hola mundo de Arduino!";

Ejemplo 4

Este ejemplo muestra como encendemos el LED a bordo enviando desde el monitor serie la letra e y lo apagas con la letra a.

void setup(){
   pinMode(LED_BUILTIN, OUTPUT);
}
void loop(){
   if (Serial.available()) {
      char entrada = Serial.read();
      if (entrada == 'e'){
         digitalWrite(LED_BUILTIN, HIGH);  //Enciende LED
      }else if (entrada == 'a'){
         digitalWrite(LED_BUILTIN, LOW);   //Apaga LED
      }
   }
}

Ejemplo 5

Si te preguntas si el tipo char acepta negativos aquí la demostración.

void setup() {
   Serial.begin(115200);
}

void loop() {
   if (Serial.available()) {
      char c = Serial.read();
      Serial.print("Enviaste: ");
      Serial.writen(c);           //Muestra la letra
      Serial.println(c, DEC);
      c = c - 80;
      Serial.print("Queda: ");
      Serial.println(c, DEC);
   }
}

Ejemplo 6

En este ejemplo hacemos la variable char igual a un numero. El monitor serie solo puede interpretar los caracteres entre 33~126.

void setup() {
   Serial.begin(115000);
   Serial.println("Mapa tabla ASCII:");
   for (char c=33; c<=126; c++){
      Serial.print(c);          //Imprime el carácter
      Serial.print(", dec: ");
      Serial.print(c, DEC);     //Imprime su valor ASCII decimal
      delay(100);
   }
}
void loop() {
   //Nada
}

Nota: Si usas byte, int, float, etc en lugar de char debes reemplazar el primer Serial.print() por Serial.write().


Ejemplo 7

En este ejemplo hacemos la variable char igual a un caracter.

void setup() {
   Serial.begin(115000);
   Serial.println("Letras mayusculas:");
   for (char c='A'; c<='Z'; c++){
      Serial.print(c);            //Imprime el carácter
      Serial.print(", dec: ");
      Serial.println(c,DEC);      //Imprime su valor ASCII decimal
      delay(100);
   }
}
void loop() {
   //Nada
}

Vea también

  bool
  byte
  char
  int
  long
  void
  word


Referencias