Tipos de datos fundamentales
Hemos mencionado que una variable debe poseer un tipo. El lenguaje define un conjunto de tipos de datos primitivos que pueden ser utilizados por nuestras por nuestras variables, propiedades y métodos. También podremos crear nuestras propios tipos por medio de clases y estructuras.
Una variable tiene asociada una posición de memoria, que es donde realmente se almacena un dato en cuestión. El identificador es, al fin y al cabo, una manera amigable de referirnos a ella. Podríamos decir, entonces, que el tipo de dato es una manera de comunicarle al compilador:
*Cuánto espacio en memoria ocupará la variable.
*Que semántica tendrá el dato almacenado.
Un número entero podría ocupar en memoria la misma cantidad de espacio que un número de punto flotante. El compilador sabrá como interpretar la información que allí encuentre precisamente por el tipo de dato que posee la variable asociada a dicha posición de memoria.
También es conveniente destacar que el compilador distingue entre los tipos de datos por el valor y los tipos de datos por referencia. Esto tiene relación con la zona de memoria que se utiliza para crear la variable en cuestión: el stack (pila) o el heap (montículo). Los tipos de datos por valor serán almacenados en el stack, mientras que los tipos de datos por referencia serán almacenados en el heap (en el stack quedará una referencia de la ubicación en dicha zona de memoria).
Números enteros
C# ofrece tres tipos de números enteros:
* short: número entero corto.
* int: número de entero signado.
* long: número de entero largo signado.
Hemos mencionado que una variable debe poseer un tipo. El lenguaje define un conjunto de tipos de datos primitivos que pueden ser utilizados por nuestras por nuestras variables, propiedades y métodos. También podremos crear nuestras propios tipos por medio de clases y estructuras.
Una variable tiene asociada una posición de memoria, que es donde realmente se almacena un dato en cuestión. El identificador es, al fin y al cabo, una manera amigable de referirnos a ella. Podríamos decir, entonces, que el tipo de dato es una manera de comunicarle al compilador:
*Cuánto espacio en memoria ocupará la variable.
*Que semántica tendrá el dato almacenado.
Un número entero podría ocupar en memoria la misma cantidad de espacio que un número de punto flotante. El compilador sabrá como interpretar la información que allí encuentre precisamente por el tipo de dato que posee la variable asociada a dicha posición de memoria.
También es conveniente destacar que el compilador distingue entre los tipos de datos por el valor y los tipos de datos por referencia. Esto tiene relación con la zona de memoria que se utiliza para crear la variable en cuestión: el stack (pila) o el heap (montículo). Los tipos de datos por valor serán almacenados en el stack, mientras que los tipos de datos por referencia serán almacenados en el heap (en el stack quedará una referencia de la ubicación en dicha zona de memoria).
Números enteros
C# ofrece tres tipos de números enteros:
* short: número entero corto.
* int: número de entero signado.
* long: número de entero largo signado.
Si son números enteros, ¿que diferencia existe entre ellos? La respuesta es sencilla: la cantidad de memoria que se deberá reservar y cuán grande es el número que cabrá dentro de nuestra variable.
En 2 bytes (short) es posible especificar un número con rango (-32768, 32767), mientras que en 4 bytes (int) es posible especificar un número dentro dentro del rango (-2147483648, 2147483647).
Por otro lado, los tipos de datos numéricos enteros pueden ser signados o no. Si especificamos un número entero corto no signado (ushort), se sigue ocupando 2 bytes, pero al ser todos positivos, el rango válido ahora es (0,65535). Si intentamos asignar un número negativo a una variable no signada, se producirá una excepción.
Declarando algunas variables enteras:
short a; //Entero corto signado
ushort b; //Entero corto no signado
int d; // Entero signado
uint e; // Entero no signado
long f; // Entero largo signado
ulong g; // Entero largo no signado
///¿Y los punteros?(Información adicional)///
Quienes vengan de C o C++ podrían preguntar: ¿dónde están los punteros? C# permite el uso de punteros igual que C++, pero para esto se deberá marcar el bloque o función como unsafe (no segura), además de modificar parámetros de compilación. En C# su uso queda relegado a necesidades específicas, como interactuar con recursos no gestionados creados en otros lenguajes.
////////////////////////////////////////
Números no enteros
C# diferencia en tipo a un número entero de un número con parte fraccionaria; para estos números de datos existen tres tipos:
* float //Precisión simple
* double //Precisión doble
* decimal //Precisión máxima
La diferencia entre ellos es la precisión. Las computadoras se llevan muy bien con los números enteros, pero al trabajar con números decimales necesitan utilizar un recurso matemático llamado "coma flotante". De esta manera es posible almacenar una cantidad no fija de decimales, pero con determinada precisión máxima; esta precisión en definitiva, se encuentra determinada por el tamaño total que ocupa la variable en la memoria. Los tres tipos de datos de números no enteros que maneja C# son:
* float: número no entero de precisión simple. Las constantes literales deben contener el agregado f en la parte decimal para que el compilador pueda tomarlas como float (por ejemplo, 4.0f).
* double: número de precisión doble (por ejemplo, 4.0).
* decimal: número no entero de precisión máxima. Las constantes literales deben contener el agregado M en la parte decimal para poder ser tomadas con decimal (por ejemplo, 4.0M).
En 2 bytes (short) es posible especificar un número con rango (-32768, 32767), mientras que en 4 bytes (int) es posible especificar un número dentro dentro del rango (-2147483648, 2147483647).
Por otro lado, los tipos de datos numéricos enteros pueden ser signados o no. Si especificamos un número entero corto no signado (ushort), se sigue ocupando 2 bytes, pero al ser todos positivos, el rango válido ahora es (0,65535). Si intentamos asignar un número negativo a una variable no signada, se producirá una excepción.
Declarando algunas variables enteras:
short a; //Entero corto signado
ushort b; //Entero corto no signado
int d; // Entero signado
uint e; // Entero no signado
long f; // Entero largo signado
ulong g; // Entero largo no signado
///¿Y los punteros?(Información adicional)///
Quienes vengan de C o C++ podrían preguntar: ¿dónde están los punteros? C# permite el uso de punteros igual que C++, pero para esto se deberá marcar el bloque o función como unsafe (no segura), además de modificar parámetros de compilación. En C# su uso queda relegado a necesidades específicas, como interactuar con recursos no gestionados creados en otros lenguajes.
////////////////////////////////////////
Números no enteros
C# diferencia en tipo a un número entero de un número con parte fraccionaria; para estos números de datos existen tres tipos:
* float //Precisión simple
* double //Precisión doble
* decimal //Precisión máxima
La diferencia entre ellos es la precisión. Las computadoras se llevan muy bien con los números enteros, pero al trabajar con números decimales necesitan utilizar un recurso matemático llamado "coma flotante". De esta manera es posible almacenar una cantidad no fija de decimales, pero con determinada precisión máxima; esta precisión en definitiva, se encuentra determinada por el tamaño total que ocupa la variable en la memoria. Los tres tipos de datos de números no enteros que maneja C# son:
* float: número no entero de precisión simple. Las constantes literales deben contener el agregado f en la parte decimal para que el compilador pueda tomarlas como float (por ejemplo, 4.0f).
* double: número de precisión doble (por ejemplo, 4.0).
* decimal: número no entero de precisión máxima. Las constantes literales deben contener el agregado M en la parte decimal para poder ser tomadas con decimal (por ejemplo, 4.0M).
No hay comentarios:
Publicar un comentario