En este artículo veremos los tipos de datos numéricos en Swift, centrándonos en los enteros, los números en punto flotante y los literales numéricos. Al igual que pasa con otros lenguajes de programación, Swift incorpora la sintaxis y reglas necesarias para el tratamiento de números dentro de nuestros programas.
Más adelante en próximos artículos veremos otro tema muy importante como es el de la conversión entre los distintos sistemas de numeración.
Datos numéricos en Swift. Los números enteros
Dentro de los datos numéricos en Swift, los números enteros son aquellos que no tienen una parte decimal, como el 21 o el 56. Existen dos tipos: los enteros con signo (signed) que abarcan los positivos, negativos y el cero; y los enteros sin signo (unsigned) que incluyen únicamente los positivos y el cero. El lenguaje de programación Swift proporciona longitudes de 8, 16, 32 y 64 bits para representar ambos tipos. A la hora de su representación hay que decir que es muy parecida a como se hace en el lenguaje C, por ejemplo, UInt8 para un entero sin signo de 8 bits y Int32 para enteros con signo de 32 bits. Todos los tipos de enteros en Swift tienen su palabra reservada capitalizada como ocurre con otros tipos de datos en el lenguaje.
Para acceder a los valores máximos y mínimos que puede tomar cada uno de los tipos de enteros usaremos las propiedades min y max que incluyen sus objetos (sin necesidad de crear una instancia de los mismos). Por ejemplo, para ver el valor minimo y máximo de un entero sin signo de 8 bits:
let valorMinimo = UInt8.min // valorMinimo es igual a 0, y su tipo es UInt8
let valorMaximo = UInt8.max // valorMaximo es igual a 255, y su tipo es UInt8
Si queremos ver los máximos y mínimos de otros tipos de datos numéricos en Swift con o sin signo procederíamos de la misma forma usando también sus propiedades max y min.
En la mayoría de las ocasiones, a la hora de escribir un programa, no es necesario especificar el tamaño de tu entero en el código. Swift proporciona un tipo de datos adicional denominado Int (con signo) y UInt (sin signo) que tienen el mismo tamaño que el ancho de palabra de la plataforma a la que destinemos nuestro programa. Por ejemplo:
- En plataformas de 32-bits, Int es del mismo tamaño que Int32.
- En plataformas de 64-bits, Int es del mismo tamaño que Int64.
- En plataformas de 32-bits, UInt es del mismo tamaño que Int32.
- En plataformas de 64-bits, UInt es del mismo tamaño que Int64.
Al menos que necesitemos trabajar con un tamaño específico de enteros, lo recomendable es usar siempre Int/UInt para valores enteros en nuestro código. Esto facilitará la interoperabilidad y la coherencia de nuestro código. Aún cuando trabajemos con plataformas de 32 bits, Int puede almacenar cualquier valor comprendido entre -2.147.483.648 y 2.147.483.647 que va a ser suficiente para nosotros.
Números en punto flotante
Continuando con los datos numéricos en Swift, los números en punto flotante (o también coma flotante) son números com parte decimal como 3.1416, 0.1 y 245.32. Este tipo de números pueden representar un rango mucho mayor que los números enteros y las variables declaradas de este tipo pueden almacenar valores muy pequeños o muy grandes de los que puede almacenar Int. Swift proporciona dos tipos de números en punto flotante con signo:
- Double. Representa un número en punto flotante de 64 bits. Usaremos este tipo de datos cuando queramos declarar variables que requieran mucha precisión. En concreto tiene una longitud máxima de 15 dígitos decimales.
- Float. Representa un número en punto flotante de 32 bits. Usaremos este otro tipo de números cuando queramos representar cantidades que no requieran demasiada precisión. En el caso del Float tiene una longitud máxima de 6 dígitos decimales.
El tipo de dato Double ya fue usado en el artículo La técnica String Interpolation en el lenguaje Swift cuando veíamos cómo crear y mostrar en consola una cadena de texto personalizada para por ejemplo, analizar el flujo de una parte de programa.
Representación de literales numéricos
Los literales enteros pueden ser representados en distintos sistemas de numeración como binario, octal y hexadecimal. El siguiente ejemplo muestra como usar esta notación:
- Un número decimal sin prefijo
- Un número binario con el prefijo 0b
- Un número octal con el prefijo 0o
- Un número hexadecimal con el prefijo 0x
Todas las constantes del siguiente ejemplo tienen el valor entero 17:
let enteroDecimal = 17
let enteroBinario = 0b10001 // 17 en notación binaria
let enteroOctal = 0o21 // 17 en notación octal
let enteroHexadecimal = 0x11 // 17 en notación hexadecimal
Dentro de los datos numéricos en Swift, los literales numéricos en Punto Flotante pueden ser números decimales (sin ningún prefijo), o hexadecimales (usando el prefijo 0x). Este tipo de representación obligatoriamente debe tener un número (o un número hexadecimal) a ambos lados de la coma decimal. También pueden tener, de forma opcional, un exponente representado por la letra e (mayúscula o minúscula da igual) para números flotantes decimales, o una letra p (mayúscula o minúscula) para números flotantes hexadecimales.
Para números decimales con exponente e, se multiplica el numero por 10 elevado al exponente.
- 1.25e2 significa 1.25 × 102, ó 125.0.
- 1.25e-2 significa 1.25 × 10-2, ó 0.0125.
Para números hexadecimales con exponente p, se multiplica el número por 2 elevado a dicho exponente exponente.
- 0xFp2 significa 15 × 22, ó 60.0.
- 0xFp-2 significa 15 × 2-2, ó 3.75.
Como vemos en el siguiente ejemplo, todos los números tienen el mismo valor 12.1875 pero están expresados de forma muy diferente.
let doubleDecimal = 12.1875
let doubleExponente = 1.21875e1
let doubleHexadecimal = 0xC.3p0
Los literales numéricos pueden contener un formato que nos permita leerlos con menor dificultad. Tanto los enteros como los números en coma flotante pueden ser rellenados con ceros adicionales y también pueden contener guiones bajos como separador de miles. Este formato distinto, por supuesto que no va a afectar al valor numérico del número subyacente. Veamos un ejemplo:
let doubleCeros = 000123.456
let unMillon = 1_000_000
let pocoMasDeUnMillon = 1_000_000.000_000_1
Hasta aquí el repaso a los diferentes tipos de datos numéricos en Swift. Espero que os haya parecido interesante el artículo y si necesitáis que os despeje alguna duda ya sabéis que podéis hacerlo rellenando este formulario. Nos leemos en la próxima.
Adiós, os!!