Una introducción al manejo de variables en C y los tipos básicos
C es un lenguaje tipado estáticamente.
Esto significa que cualquier variable tiene un tipo asociado, y este tipo se conoce en el momento de la compilación.
Esto es muy diferente a cómo se trabaja con variables en Python, JavaScript, PHP y otros lenguajes interpretados.
Cuando se crea una variable en C, hay que especificar el tipo de variable en la declaración.
En este ejemplo inicializamos una variable age
con el tipo int
:
int age;
Un nombre de variable puede contener cualquier letra mayúscula o minúscula, puede contener dígitos y el carácter de guión bajo, pero no puede comenzar con un dígito. AGE
y Age10
son nombres de variables válidos, 1age
no lo es.
También puedes inicializar una variable en la declaración, especificando el valor inicial:
int age = 37;
Una vez que declaras una variable, puedes usarla en el código de tu programa y puedes cambiar su valor en cualquier momento, usando el =
operador por ejemplo, como en age = 100;
, siempre que el nuevo valor sea del mismo tipo.
En este caso:
#include stdio.hint main(void) {int age = 0;age = 37.2;printf("%u", age);}
El compilador emitirá una advertencia en el momento de la compilación y convertirá el número decimal en un valor entero.
Los tipos de datos integrados de Cint
son , char
, short
, long
, float
, double
, long double
. Descubramos más sobre ellos.
Números enteros
C nos proporciona los siguientes tipos para definir valores enteros:
char
int
short
long
La mayoría de las veces, probablemente usarás un int
para almacenar un número entero. Pero en algunos casos, es posible que quieras elegir una de las otras tres opciones.
El char
tipo se utiliza habitualmente para almacenar letras del diagrama ASCII, pero se puede utilizar para almacenar números enteros pequeños de -128
hasta 127
. Ocupa al menos 1 byte.
int
toma al menos 2 bytes. short
toma al menos 2 bytes. long
toma al menos 4 bytes.
Como puede ver, no tenemos la garantía de que los valores sean los mismos para diferentes entornos. Solo tenemos una indicación. El problema es que los números exactos que se pueden almacenar en cada tipo de datos dependen de la implementación y la arquitectura.
Le garantizamos que short
no es más largo que int
. Y le garantizamos long
que no es más corto que int
.
El estándar de especificaciones ANSI C determina los valores mínimos de cada tipo, y él podemos al menos saber cuál es el valor mínimo que podemos esperar tener a nuestra disposición.
Si estás programando C en un Arduino, cada placa tendrá diferentes límites.
En una placa Arduino Uno, int
almacena un valor de 2 bytes, que va de -32,768
a 32,767
. En un Arduino MKR 1010, int
almacena un valor de 4 bytes, que va de -2,147,483,648
a 2,147,483,647
. Una diferencia bastante grande.
En todas las placas Arduino, short
almacena un valor de 2 bytes, que va desde -32,768
hasta 32,767
. long
almacena 4 bytes, que van desde -2,147,483,648
hasta 2,147,483,647
.
Enteros sin signo
Para todos los tipos de datos anteriores, podemos anteponer unsigned
el valor inicial del rango en 0, en lugar de un número negativo. Esto podría tener sentido en muchos casos.
unsigned char
oscilará entre0
al menos255
unsigned int
oscilará entre0
al menos65,535
unsigned short
oscilará entre0
al menos65,535
unsigned long
oscilará entre0
al menos4,294,967,295
El problema del desbordamiento
Teniendo en cuenta todos esos límites, podría surgir una pregunta: ¿cómo podemos asegurarnos de que nuestros números no superen el límite? ¿Y qué sucede si lo superamos?
Si tienes un unsigned int
número en 255 y lo incrementas, obtendrás 256 como resultado. Como se esperaba. Si tienes un unsigned char
número en 255 y lo incrementas, obtendrás 0 como resultado. Se reinicia a partir del valor inicial posible.
Si tienes un unsigned char
número 255 y le sumas 10, obtendrás el número 9
:
#include stdio.hint main(void) { unsigned char j = 255; j = j + 10; printf("%u", j); /* 9 */}
Si tiene un valor con signo, el comportamiento no está definido. Básicamente, le proporcionará un número enorme que puede variar, como en este caso:
#include stdio.hint main(void) { char j = 127; j = j + 10; printf("%u", j); /* 4294967177 */}
En otras palabras, C no te protege de sobrepasar los límites de un tipo. Debes encargarte de esto tú mismo.
Advertencias al declarar el tipo incorrecto
Cuando declaras la variable y la inicializas con el valor incorrecto, el gcc
compilador (el que probablemente estás usando) debería advertirte:
#include stdio.hint main(void) { char j = 1000;}
hello.c:4:11: warning: implicit conversion from 'int' to 'char' changes value from 1000 to -24 [-Wconstant-conversion] char j = 1000; ~ ^~~~1 warning generated.
Y también te advierte en las asignaciones directas:
#include stdio.hint main(void) { char j; j = 1000;}
Pero no si aumentas el número usando por ejemplo +=
:
#include stdio.hint main(void) { char j = 0; j += 1000;}
Números de punto flotante
Los tipos de punto flotante pueden representar un conjunto de valores mucho más grande que los números enteros, y también pueden representar fracciones, algo que los números enteros no pueden hacer.
Utilizando números de punto flotante, representamos números como números decimales multiplicados por potencias de 10.
Es posible que vea números de punto flotante escritos como
1.29e-3
-2.3e+5
y de otras maneras aparentemente extrañas.
Los siguientes tipos:
float
double
long double
Se utilizan para representar números con puntos decimales (tipos de punto flotante). Todos pueden representar números positivos y negativos.
Los requisitos mínimos para cualquier implementación de C son que float
pueda representar un rango entre 10^-37 y 10^+37, y generalmente se implementa utilizando 32 bits. double
Puede representar un conjunto más grande de números. long double
Puede contener incluso más números.
Las cifras exactas, al igual que con los valores enteros, dependen de la implementación.
En una Mac moderna, a float
se representa en 32 bits y tiene una precisión de 24 bits significativos, de los cuales 8 bits se utilizan para codificar el exponente. Un double
número se representa en 64 bits, con una precisión de 53 bits significativos, de los cuales 11 bits se utilizan para codificar el exponente. El tipo long double
se representa en 80 bits, tiene una precisión de 64 bits significativos, de los cuales 15 bits se utilizan para codificar el exponente.
En su computadora específica, ¿cómo puede determinar el tamaño específico de los tipos? Puede escribir un programa para hacerlo:
#include stdio.hint main(void) { printf("char size: %lu bytesn", sizeof(char)); printf("int size: %lu bytesn", sizeof(int)); printf("short size: %lu bytesn", sizeof(short)); printf("long size: %lu bytesn", sizeof(long)); printf("float size: %lu bytesn", sizeof(float)); printf("double size: %lu bytesn", sizeof(double)); printf("long double size: %lu bytesn", sizeof(long double));}
En mi sistema, un Mac moderno, imprime:
char size: 1 bytesint size: 4 bytesshort size: 2 byteslong size: 8 bytesfloat size: 4 bytesdouble size: 8 byteslong double size: 16 bytes
Tips C
Tal vez te puede interesar:
- Introducción a React
- Agregar evento de clic a los elementos DOM devueltos desde querySelectorAll
- Cómo cambiar el valor de un nodo DOM
- Cómo comprobar si un elemento DOM tiene una clase
Variables y tipos en C
Números enterosEnteros sin signoEl problema del desbordamientoAdvertencias al declarar el tipo incorrectoNúmeros de punto flotante
programar
es
2025-01-03

Si crees que alguno de los contenidos (texto, imagenes o multimedia) en esta página infringe tus derechos relativos a propiedad intelectual, marcas registradas o cualquier otro de tus derechos, por favor ponte en contacto con nosotros en el mail [email protected] y retiraremos este contenido inmediatamente