miércoles, 10 de julio de 2013

Tipos de Datos Numéricos en C# - Parte 1

Tabla de Contenido

1. Palabras Clave
2. Introducción
3. Tipos Numéricos Predefinidos en C#
4. Literales Numéricas
4.1 Deducción de literales de tipo numérico
4.2 Sufijos numéricos
5. Conclusiones
6. Literales & Enlaces

1. Palabras Clave

  • C#
  • Literal
  • Notación decimal
  • Notación hexadecimal
  • Tipo de dato

2. Introducción

En esta ocasión se ahonda en el estudio de los tipos de datos numéricos predefinidos en el lenguaje de programación C# (en el artículo anterior se reconoció la estructuración taxonómica de estos tipos de datos). En particular, en este artículo se estudia más a fondo los tipos de datos numéricos y otros temas relacionados: literales numéricas, cómo C# deduce el tipo de dato de una literal numérica y los sufijos utilizados para definir explícitamente el tipo de dato de una literal.

3. Tipos Numéricos Predefinidos en C#

El lenguaje de programación C# cuenta con un amplio número categorizado de tipos de datos numéricos predefinidos. En la Tabla 1 (Albahari (02012)) se muestra la lista con la taxonomía correspondiente.
Tipos numéricos predefinidos en C#
Tabla 1. Tipos numéricos predefinidos en C# (Albahari (2012)).

Nota

El lenguaje de programción C# y la máquina virtual CLR (Common Language Runtime) consideran a los tipos de datos int y long como de primera clase o que tienen mayor precedencia en el tratamiento. Mientras que los restantes tipos de datos, es decir, bytesbyteshortushort, uintulong, son considerados aptos para escenarios de interoperabilidad o eficiencia de espacio en memoria del sistema.

Nota

Los tipos de datos double y float son utilizados para cálculos científicos sobre números reales. El tipo de dato real decimal es comúnmente usado para cálculos financieros debido a que aporta alta precisión para operaciones aritméticas.

4. Literales Numéricas

Las literales numéricas son valores que se pueden expresar en notación decimal o hexadecimal, denotado con el prefijo 0x. Ejemplos de estas literales:

int x = 127; // Notación decimal
long y = 0x7F; // Notación hexadecimal

En cuanto a literales reales, es posible utilizar la notación decimal y/o exponencial, así:

double d = 1.5; // Notación decimal
double millon = 1E06; // Notación exponencial

Nota

Vale recordar que, una «literal» significa un valor codificado expresamente en el código fuente del programa, es decir una cadena de caracteres, un carácter, un número entero, un número de coma flotante (float o double).

4.1 Deducción de tipos de literales numéricas

De acuerdo con Albahari (2012), por defecto el compilador deduce si una literal es double o de un tipo entero de acuerdo a las siguientes condiciones:
  • Si la literal contiene un punto decimal o el símbolo exponencial (E), entonces la literal es double.
  • En caso contrario, el tipo de la literal puede corresponder con la primera coincidencia de la siguiente lista:
    • int
    • uint
    • long
    • ulong
Algunos ejemplos:

Console.WriteLine(1.0.GetType()); // Double (double)
Console.WriteLine(1E06.GetType()); // Double (double)
Console.WriteLine(1.GetType()); // Int32 (int)
Console.WriteLine(0xF0000000.GetType()); // UInt32 (uint)

4.2 Sufijos Numéricos

Las sufijos numéricos definen de forma explícita el tipo de dato de una literal. Estos sufijos se pueden escribir en letra minúscula o mayúscula. En la Tabla 2 se puede ver los literales soportados por C#.
Sufijos numéricos en C# para tipos predefinidos.
Tabla 2. Sufijos numéricos en C# Albahari [2012].
Hay que tener en cuenta que las literales U y L son usadas casualmente debido a que las literales enteras uintlong, y ulong, son convertidas implícitamente desde int:

long i = 5; // Conversión implícita sin pérdidda desde literal int a long

Otro caso especial ocurre con el sufijo D, en el cual todas las literales con punto decimal son consideradas double. Ejemplo:

double x = 7.0; // Implícitamente considerada de tipo de dato double

Los sufijos F y M son los útiles y deberían siempre especificarse cuando se manipule literales double o decimal. Debe recordarse que si no se especifica el sufijo F a una literal float  se generará un error:

float f = 4.5; // Sin en el prefijo F la compilación falla.

Este error también ocurre para las literales decimal:

decimal d = -1.23; // Sin en el prefijo M la compilación falla.

5. Conclusiones

Se estudió las literales numéricas y su manipulación. También se aprendió y se entendió acerca de las literales numéricas y cómo el compilador determina el tipo de dato a partir de los sufijos especificados. Se enumeraron las condiciones básicas que el compilador utiliza para determinar el tipo de dato de una literal numérica. Al finalizar, se estudiaron los sufijos numéricos para señalar explícitamente el tipo de una literal.

6. Literatura & Enlaces

[1]: C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[2]: Why int and long types are first-class and favored by C# and the runtime? - http://stackoverflow.com/questions/17537533/why-int-and-long-types-are-first-class-and-favored-by-c-sharp-and-the-runtime
[3]: C# Suffix Examples, Numeric Suffixes - http://www.dotnetperls.com/suffix

V

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.