Curso de C# desde cero

Introducción a las variables y sus tipos de datos

Capítulo 3: Los tipos de datos y las variables


En este capítulo, ya te vas a poner a programar. Aprenderás lo básico sobre las variables y los tipos de datos en C#.

¿Qué son las variables?

Las variables son contenedores para almacenar datos y como su nombre indica, los datos pueden variar.

Estos contenedores, son pequeños espacios en la memoria RAM del ordenador que se reservan para guardar datos.

Los datos pueden ser de diferentes tipos, como texto, números enteros, números decimales, valores booleanos, etc.
Por lo tanto, necesitamos contenedores de diferentes tipos y tamaños, ya que no ocupa el mismo espacio un número 10, que un número así de grande: 1039039046050556546456.

El poder manejar diferentes tipos de variables o contenedores nos va a servir para optimizar al máximo el espacio de la memoria del ordenador. ¿Para qué utilizar con un valor 10 una caja en la que cabe un número así 1039039046050556546456?

Ahora imagina un camión de mudanzas. Este representa la memoria RAM. El tamaño del camión es finito, por lo tanto, si no se aprovecha bien el espacio, se desperdicia.

Entonces, ¿utilizarías una caja de medio metro cuadrado para guardar algo pequeño como unos zapatos? La respuesta coherente, siempre será que no, ya que si lo almacenas todo de esta forma, en lugar de necesitar 1 camión para la mudanza, necesitarás varios. Eso se traduce en poco eficiente.

Esto mismo va a ocurrir con tus programas si no manejas bien los tamaños de las variables, ya que estas ocuparán memoria de más sin necesidad alguna. Finalmente eso se traduce en que tus programas necesitarán más memoria de la que realmente necesitan.

En C# tenemos muchos tipos de datos que se utilizan para almacenar datos de todo tipo, números enteros, decimales, texto (cadenas de caracteres), booleanos, etc. A continuación, te describo algunos de ellos divididos en 2 grupos, 13 de ellos son datos simples y otros 3 complejos.

Tipos de datos de C#

Tipos simples de C#

De los 13 tipos de datos simples, 11 son numéricos. Los podemos dividir en 3 categorías:

  • 8 tipos enteros de longitud variante con o sin signo.
    • sbyte
    • byte
    • short
    • ushort
    • int
    • uint
    • long
    • ulong
  • 2 tipos de coma flotante.
    • float
    • double
  • 1 tipo de mayor precisión para decimales.
    • decimal

Nos quedan los otros 2 tipos de datos simples:

  • char
  • bool

Tipos no simples de C#

Y aquí, algunos tipos de datos especiales:

  • object
  • string
  • dynamic
Tipo de dato de C# Tamaño Rangos ¿Con signo? Sufijo
sbyte 8 bits (1 byte) -128 a 127 Si
byte 8 bits (1 byte) 0 a 255 No
short 16 bits (2 bytes) -32.768 a 32.767 Si
ushort 16 bits (2 bytes) 0 a 65.535 No
int 32 bits (4 bytes) -2.147.483.648 a 2.147.483.647 Si
uint 32 bits (4 bytes) 0 a 4.294.967.295 No u
long 64 bits (8 bytes) -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 Si l
ulong 64 bits (8 bytes) 0 a 18.446.744.073.709.551.615 No ul
float 32 bits (4 bytes) 6 a 9 dígitos f
double 64 bits (8 bytes) 15 a 17 dígitos d
decimal 128 bits  (16 bytes) 28 a 29 dígitos m
bool true, false

Vamos a probar los 8 primeros tipos de datos, los datos numéricos enteros, en el siguiente probaremos los decimales.

El tipo de dato numérico entero sbyte de C#

Este tipo de dato es el más pequeño con signo de C#. Admite números muy pequeños, de -128 a 127. Esta pequeña capacidad del contenedor o variable es debida a que se reserva solo 8 bits en memoria. Si miras la tabla de tipos de datos de arriba, podrás ver que a cuanto mayor es la capacidad del tipo de dato de una variable, mayor es su tamaño en bits.

Saber utilizar bien los tipos de datos para ajustarlos a los datos almacenados en las variables es una de las claves para crear programas más rápidos y ligeros. Óptimos es la palabra acertada.

En el siguiente código he creado una variable. Para hacerlo, he tenido que indicar el tipo de dato que va a contener, en este caso es sbyte, ya que quiero almacenar un dato numérico 50, el cual cabe perfectamente en una variable sbyte.

Las variables de tipo sbyte son buenas para almacenar edades por ejemplo, ya que normalmente, nadie llega a vivir más de los 127 años . También para días del mes o cualquier dato pequeño ya sea negativo o positivo.

Para asegurarme de que te queda totalmente claro, sbyte es el tipo de dato, numero1 (o el nombre que le quieras dar) es el nombre de la variable, el cual deberás seguir unas ciertas normas para nombres que veremos en otro capítulo. Con el símbolo = se le da un valor a la variable, en este caso 50 pero puede ser cualquiera de entre -128 y 127. Se finaliza la variable con un punto y coma.

Puedes declarar una variable sin darle un valor, por ejemplo sbyte numero1; Esto quiere decir que la has declarado, en el momento que le des un valor por primera vez la estarás iniciando.

using System;
	
namespace Tests
{
	class Program
	{
		static void Main(string[] args)
		{
			sbyte numero1 = 50;
			Console.WriteLine(numero1);
		}
	}
}

Este es el resultado que aparecerá si ejecutas el código anterior. Gracias a Console.WriteLine, se puede mostrar el valor de una variable solo con nombrarla.

50

Valores incorrectos para tipos de datos de C#

¿Qué pasa si introduces un valor no admitido por un tipo de dato? probémoslo introduciendo el valor 700 en una variable de tipo sbyte.

using System;
	
namespace Tests
{
	class Program
	{
		static void Main(string[] args)
		{
			sbyte numero1 = 700;
			Console.WriteLine(numero1);
		}
	}
}

El resultado es que el programa no compila, ya que no se puede guardar un valor tan grande en sbyte.
Para poder almacenar un valor de 700, tendrías que utilizar mínimo una variable de tipo short (mira la tabla de arriba)

Error CS0031: El valor constante '700' no se puede convertir en 'sbyte'	Tests

El tipo de dato numérico entero byte de C#

sbyte es un tipo de dato con signo, lo que permite que sus 8 bits (caben 256 valores) se dividan entre los números negativos y positivos, 127 + el número 0 (128 valores positivos) + 128 valores negativos hacen un total de 256 valores, lo que ocupa en la memoria los 8 bits, de ahí el tamaño del tipo de dato.

En cambio, byte no tiene signo, lo que impide que utilicemos números negativos en él, pero en cambio, podemos utilizar los valores que sbyte eran negativos para admitir más positivos. Si utilizamos los 8 bits para números positivos, nos da la posibilidad de almacenar números de 0 al 255 positivos (256 valores posibles).

using System;
	
namespace Tests
{
	class Program
	{
		static void Main(string[] args)
		{
			byte numero1 = 210;
			Console.WriteLine(numero1);
		}
	}
}

Como puedes ver, en este caso, si intentas poner un número como 210, no habrá problema. En cambio, no puedes poner ningún número negativo.

210

El tipo de dato numérico entero short de C#

El tipo de dato short ya nos abre más posibilidades, ya que admite 65.536 dígitos y tiene signo, lo que nos da un rango de entre -32.768 y 32.767. Al aumentar tanto la capacidad, aumenta también el tamaño de la variable, ya que ocupa el doble que sbyte o byte.

using System;
	
namespace Tests
{
	class Program
	{
		static void Main(string[] args)
		{
			short numero1 = -17800;
			Console.WriteLine(numero1);
		}
	}
}
-17800

El tipo de dato numérico entero ushort de C#

El tipo de dato ushort es sin signo y tiene un tamaño de 16 bits al igual que short, lo que hace que no admita números negativos pero que tenga sus 65.536 posibilidades en positivo (del 0 al 65.535).

using System;
	
namespace Tests
{
	class Program
	{
		static void Main(string[] args)
		{
			short numero1 = 61000;
			Console.WriteLine(numero1);
		}
	}
}
61000

El tipo de dato numérico entero int de C#

El tipo de dato numérico más usado suele ser int, tiene un tamaño intermedio de 4 bytes y es suficientemente grande para cubrir la mayor parte de las necesidades numéricas. Tiene signo y por lo tanto, admite números negativos. Es capaz de almacenar números de -2.147.483.648 a 2.147.483.647. Más de 2000 millones son suficientes para casi todo.

using System;
	
namespace Tests
{
	class Program
	{
		static void Main(string[] args)
		{
			int numero1 = 1700456452;
			Console.WriteLine(numero1);
		}
	}
}
1700456452

El tipo de dato numérico entero uint de C#

En el caso de uint, como no tiene signo, podemos utilizar números del 0 al 4.294.967.295, más de 4 billones. No obstante, no se pueden utilizar números negativos.

Si no pones el sufijo (los sufijos están en la tabla de arriba) a los tipos de datos que corresponde, el programa compila.
using System;
	
namespace Tests
{
	class Program
	{
		static void Main(string[] args)
		{
			uint numero1 = 3500456452u;
			Console.WriteLine(numero1);
		}
	}
}
3500456452

El tipo de dato numérico entero long de C#

Ya nos vamos a números muy grandes. El tipo de dato long tiene signo y permite valores numéricos de -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807. Ocupa el doble que int o uint y 4 veces el tamaño de un short o ushort y 8 veces el tamaño de de byte y sbyte. Utilízalo solo cuando necesites números tan largos.

Los sufijos se pueden escribirse en minúscula y en minúscula. De hecho, Visual Studio recomienda pero no obliga a escribir el sufijo de long L en mayúsculas ya que una l minúscula es fácilmente confundible con el dígito 1 o con la letra i mayúscula.
using System;
	
namespace Tests
{
	class Program
	{
		static void Main(string[] args)
		{
			long numero1 = -9223372036854775807L;
			Console.WriteLine(numero1);
		}
	}
}
-9223372036854775807

El tipo de dato numérico entero ulong de C#

Acabamos con este kilométrico capítulo viendo el último de los 8 tipos enteros, ulong, el cual no tiene signo y permite valores numéricos enteros del 0 al 18.446.744.073.709.551.615. Ocupa 64 bits como long y tiene el sufijo ul.

using System;
	
namespace Tests
{
	class Program
	{
		static void Main(string[] args)
		{
			long numero1 = -18000000000000000000UL;
			Console.WriteLine(numero1);
		}
	}
}
18000000000000000000UL

Espero que te haya quedado todo claro, no te preocupes si no lo entiendes todo, esto está comenzando todavía y quedan muchas cosas por ver y probar.
Por cierto, aún no se acaba el capítulo. Te dejo unos ejercicios para que pruebes si realmente sabes manejar todo lo aprendido en este capítulo. Si te quedan dudas, como siempre digo, déjame un comentario.


Ejercicios de C#

  1. ¿Qué tipo de dato numérico más óptimo deberías utilizar preferentemente para un dato de edad de persona como por ejemplo 29?
  2. ¿Qué tipo de dato numérico más óptimo deberías utilizar preferentemente para almacenar el número 3595432383?
  3. ¿Qué tipo de dato numérico más óptimo deberías utilizar preferentemente para almacenar el número -1565427373?
  4. ¿Qué tipo de dato numérico más óptimo deberías utilizar preferentemente para almacenar el número 233?
  5. ¿Qué tipo de dato numérico más óptimo deberías utilizar preferentemente para almacenar el número 61005?
  6. La solución la encontrarás aquí: Haz click aquí.


    Comentarios

    Si te quedan dudas sobre el temario, sobre C#, o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.

Programación Fácil YouTube

Suscríbete

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.