¿Qué es qué? · bei.pm
En esta sección hay artículos sobre formatos de archivo y ingeniería inversa.
Ahora bien:
Hay muchas lenguajes de programación allá afuera y muchas personas que conocen ciertas cosas bajo nombres completamente diferentes - o que ni siquiera tienen idea de la existencia de conceptos fundamentales, porque su lenguaje de programación los abstrae de ello.
tl;dr:
Mi notación se basa aproximadamente en C99 <stdint.h>
. Quien pueda entender esta notación seguramente podrá manejarse con la mía.
Entero
Integer son, en términos simples, números enteros, es decir, números sin parte decimal.
Los Integer en los formatos de datos generalmente están definidos dentro de un rango de números fijo, prácticamente una resolución. Esto lo indico en bits, ya que un "byte" y los tipos derivados (Word, Qword, ...) suelen ser dependientes de la plataforma.
Además, se distingue entre tipos de Integer, como números naturales (ℕ, es decir, sin signo - Unsigned) y números enteros (ℤ, es decir, con signo - Signed).
Esta información se indica mediante un signo en el identificador (u
o s
).
Es posible que los números enteros con signo se representen ya sea como complemento a uno o como complemento a dos.
Salvo que se indique lo contrario, se utiliza el complemento a dos, ya que es la representación preferida en la informática moderna.
Los números sin signo se indican en mi documentación como uint
, seguido de la especificación de la precisión en Bits.
Los números con signo se indican en mi documentación como sint
, también con la especificación de la precisión en Bits.
No utilizo el tipo de dato "char" para caracteres, ya que las cadenas de caracteres suelen ser solo secuencias de valores Integer con una interpretación especial.
Por lo tanto, se representan como uint(8)[].
Ejemplos:
Notación | Equivalente C99 stdint.h |
Descripción | Rango numérico |
---|---|---|---|
uint(16) | uint16_t | Entero sin signo, longitud de 16 bits | 0 - 65.535 |
sint(8) | int8_t | Entero con signo, longitud de 8 bits, complemento a dos | -126 - 127 |
uint(24) | uint32_t:24 | Entero sin signo, longitud de 24 bits | 0 - 16.777.216 |
Valores de punto fijo
Los valores de punto fijo son valores numéricos del espectro de los números racionales (Q), que por lo tanto tienen una coma y decimales.
En los valores de punto fijo, - de ahí su nombre - la posición de la coma está fijada por el tipo de dato.
Esto también da lugar a un rango numérico fijo para números de este tipo; expresado matemáticamente, el espacio numérico es finito.
En la práctica, este tipo de dato se utiliza principalmente en plataformas sin unidades de hardware de punto flotante suficientemente rápidas, ya que el cálculo de valores de punto fijo puede realizarse mediante unidades enteras.
Además, el tipo de dato es utilizado, por ejemplo, por sistemas de gestión de bases de datos, cuando se deben cumplir requisitos fijos.
Pensemos, por ejemplo, en sistemas para el almacenamiento permanente de datos financieros; la mayoría de las monedas se limitan a 2 decimales.
(No es conveniente utilizar valores de punto fijo para esto; es más inteligente, en su lugar, almacenar directamente la unidad monetaria más pequeña como un entero y dejar el resto de la representación a un nivel superior)
De manera análoga a las especificaciones enteras, en los valores de punto fijo indico la resolución del número antes y después de la coma:
ufixed(9,7)
se refiere a un tipo de dato que reserva 9 bits sin signo para el valor antes de la coma, y 7 bits para el valor después de la coma; en total es de 16 bits de ancho y puede cubrir, por ejemplo, un rango de (0,0) a (511,127) como un vector de dos enteros independientes.
Sin embargo, esta interpretación dejaría sin usar 28 números en su representación decimal, ya que probablemente se limitaría a un máximo de (511,99) en la práctica.
En lugar de una interpretación directa del valor de punto fijo como un vector de 2 enteros separados - lo que casi siempre significa un área de datos no utilizada al convertir a números decimales y una transferencia manual - el área decimal puede interpretarse como un fracción de toda su resolución.
En el ejemplo del mencionado ufixed(9,7)
, se obtiene así una fracción con un denominador de 27 - el rango numérico va de 0,00 a 511 + 126⁄127
Para convertir a una representación decimal, el decimal debe dividirse por 128.
Con esta variante, las operaciones matemáticas son más simples, ya que la transferencia se produce automáticamente, lo que hace que esta variante sea generalmente preferida.
Sin embargo, esta variante tiene la desventaja de que los decimales en la representación decimal ya no cuentan con una resolución garantizada, es decir, un solo decimal no representa 0.01
, sino 0.007874
, lo que dará lugar a errores de redondeo correspondientes.
La forma de interpretación que se utiliza se documenta en el lugar de uso correspondiente.
Valores de punto flotante
Los valores de punto flotante son expresiones matemáticas más complejas, donde un número entero con una resolución fija se expresa a través de un término matemático de tal manera que efectivamente la parte decimal se forma mediante un desplazamiento, orientándose directamente a la notación científica.
La manera más común de implementar esto se estandarizó con
IEEE 754 y ha sido reconocida internacionalmente desde entonces.
Un valor de punto flotante generalmente consiste en los siguientes componentes:
Signo (0 o 1 ) |
Exponente | Mantisa |
Mientras que el signo se puede derivar fácilmente como una información binaria de sí/no, el número real se forma a través de la ecuación
Mantisa * 2Exponente
Además, hay una serie de valores constantes que cubren casos especiales de números racionales - entre ellos ±∞
y NaN
("no es un número válido").
Los valores de punto flotante son especialmente útiles cuando la precisión no es tan importante, ya que con este tipo de valores inevitablemente se producen errores de redondeo y, por lo tanto, pérdidas de precisión. Típicamente, los valores de punto flotante se utilizan, por ejemplo, para definir coordenadas, como vectores de vértice en modelos 3D o curvas Bézier/Spline para fines de representación óptica.
En los formatos de datos, los valores de punto flotante se especifican como float(Mantisa, Exponente)
.
Si se utiliza un formato diferente a IEEE 754, esto se indicará en consecuencia.