Formato de número de computadora

Compartir Imprimir Citar

Un formato de número de computadora es la representación interna de valores numéricos en hardware y software de dispositivos digitales, como en computadoras y calculadoras programables. Los valores numéricos se almacenan como agrupaciones de bits, como bytes y palabras. La codificación entre valores numéricos y patrones de bits se elige por conveniencia de la operación de la computadora; la codificación utilizada por el conjunto de instrucciones de la computadora generalmente requiere conversión para uso externo, como para impresión y visualización. Diferentes tipos de procesadores pueden tener diferentes representaciones internas de valores numéricos y se utilizan diferentes convenciones para números enteros y reales. La mayoría de los cálculos se llevan a cabo con formatos numéricos que caben en un registro del procesador, pero algunos sistemas de software permiten la representación de números arbitrariamente grandes utilizando múltiples palabras de memoria.

Representación de números binarios

Las computadoras representan datos en conjuntos de dígitos binarios. La representación se compone de bits, que a su vez se agrupan en conjuntos más grandes como bytes.

Cuadro 1
Cadena binariaValor Octal
0000
0011
0102
0113
1004
1015
1106
1117
Tabla 2: Número de valores para una cadena de bits.
Longitud de la cadena de bits (b)Número de posibles valores (N)
12
24
38
416
532
664
7128
8256
9512
101024
...

Un bit es un dígito binario que representa uno de dos estados. El concepto de bit puede entenderse como un valor de 1 o 0, on o off, < i>sí o no, verdadero o falso, o codificado por un interruptor o conmutador de algún tipo.

Mientras que un solo bit, por sí solo, puede representar solo dos valores, se puede usar una cadena de bits para representar valores más grandes. Por ejemplo, una cadena de tres bits puede representar hasta ocho valores distintos, como se ilustra en la Tabla 1.

A medida que aumenta el número de bits que componen una cadena, el número de posibles combinaciones 0 y 1 aumenta exponencialmente. Un solo bit permite solo dos combinaciones de valores, dos bits combinados pueden formar cuatro valores separados, tres bits para ocho, y así sucesivamente, aumentando con la fórmula 2^n. La cantidad de combinaciones posibles se duplica con cada dígito binario agregado, como se ilustra en la Tabla 2.

Las agrupaciones con un número específico de bits se usan para representar cosas diferentes y tienen nombres específicos.

Un byte es una cadena de bits que contiene el número de bits necesarios para representar un carácter. En la mayoría de las computadoras modernas, esta es una cadena de ocho bits. Debido a que la definición de un byte está relacionada con la cantidad de bits que componen un carácter, algunas computadoras más antiguas han usado una longitud de bits diferente para su byte. En muchas arquitecturas informáticas, el byte es la unidad direccionable más pequeña, el átomo de direccionabilidad, por ejemplo. Por ejemplo, aunque los procesadores de 64 bits pueden direccionar la memoria a sesenta y cuatro bits a la vez, aún pueden dividir esa memoria en partes de ocho bits. Esto se llama memoria direccionable por bytes. Históricamente, muchas CPU leen datos en múltiplos de ocho bits. Debido a que el tamaño de byte de ocho bits es tan común, pero la definición no está estandarizada, el término octeto a veces se usa para describir explícitamente una secuencia de ocho bits.

Un nibble (a veces nybble), es un número compuesto por cuatro bits. Al ser medio byte, el mordisco se nombró como un juego de palabras. Una persona puede necesitar varios mordiscos para un bocado de algo; De manera similar, un nybble es parte de un byte. Debido a que cuatro bits permiten dieciséis valores, un nibble a veces se conoce como dígito hexadecimal.

Visualización de números octales y hexadecimales

La codificación octal y hexadecimal son formas convenientes de representar números binarios, tal como las usan las computadoras. Los ingenieros informáticos a menudo necesitan escribir cantidades binarias, pero en la práctica, escribir un número binario como 1001001101010001 es tedioso y propenso a errores. Por lo tanto, las cantidades binarias se escriben en base 8, o "octal", o, mucho más comúnmente, en base 16, "hexadecimal" (hex), formato de número. En el sistema decimal, hay 10 dígitos, del 0 al 9, que se combinan para formar números. En un sistema octal, solo hay 8 dígitos, del 0 al 7. Es decir, el valor de un octal "10" es lo mismo que un decimal "8", un octal "20" es un decimal "16", y así sucesivamente. En un sistema hexadecimal, hay 16 dígitos, del 0 al 9 seguidos, por convención, de la A a la F. Es decir, un dígito hexadecimal "10" es lo mismo que un decimal "16" y un hexadecimal "20" es lo mismo que un decimal "32". Un ejemplo y una comparación de números en diferentes bases se describe en la siguiente tabla.

Al escribir números, se utilizan caracteres de formato para describir el sistema numérico, por ejemplo, 000_0000B o 0b000_00000 para números binarios y 0F8H o 0xf8 para números hexadecimales.

Conversión entre bases

Cuadro 3: Comparación de valores en diferentes bases
DecimalbinarioOctalHexadecimal
0000 0000000
10000010101
20000100202
30000110303
40000404
50001010505
60001100606
70001110707
80010001008
90010011109
1000101010120A
11001011130B
12001100140C
13001101150D
14001110160E
15001111170F

Cada uno de estos sistemas numéricos es un sistema posicional, pero mientras que los pesos decimales son potencias de 10, los pesos octales son potencias de 8 y los pesos hexadecimales son potencias de 16. Para convertir de hexadecimal u octal a decimal, para cada dígito uno multiplica el valor del dígito por el valor de su posición y luego suma los resultados. Por ejemplo:

Representación de fracciones en binario

Números de punto fijo

El formato de punto fijo puede ser útil para representar fracciones en binario.

Se debe elegir el número de bits necesarios para la precisión y el rango deseados para almacenar las partes enteras y fraccionarias de un número. Por ejemplo, usando un formato de 32 bits, se pueden usar 16 bits para el número entero y 16 para la fracción.

El bit del ocho es seguido por el bit del cuatro, luego el bit del dos, luego el bit del uno. Los bits fraccionarios continúan el patrón establecido por los bits enteros. El siguiente bit es el de la mitad, luego el de un cuarto, luego el de ⅛, y así sucesivamente. Por ejemplo:

bits enterosbits fraccionados
0,50=1/2=00000000
1.250=1+1/4=00000000 00000001.01000000 00000000000
7.375=7+3/8=00000000 00000111.01100000 00000000

Esta forma de codificación no puede representar algunos valores en binario. Por ejemplo, la fracción 1/5, 0,2 en decimal, las aproximaciones más cercanas serían las siguientes:

13107 / 65536=00000000 00000000.00110011 00110011=0.1999969... en decimal
13108 / 65536=00000000 00000000.00110011 00110100=0.2000122 en decimal

Aunque se utilicen más dígitos, es imposible una representación exacta. El número 1/3, escrito en decimal como 0.333333333..., continúa indefinidamente. Si finaliza prematuramente, el valor no representaría 1/3 precisamente.

Números de coma flotante

Si bien en los sistemas digitales se utilizan enteros con signo y sin signo, ni siquiera un número entero de 32 bits es suficiente para manejar todo el rango de números que puede manejar una calculadora, y eso ni siquiera incluye fracciones. Para aproximar el mayor rango y precisión de los números reales, tenemos que abandonar los números enteros con signo y los números de punto fijo e ir a un "punto flotante" formato.

En el sistema decimal, estamos familiarizados con los números de punto flotante de la forma (notación científica):

1.1030402 × 105 = 1.1030402 × 100000 = 110304.02

o, de forma más compacta:

1.1030402E5

que significa "1,1030402 veces 1 seguido de 5 ceros". Tenemos un cierto valor numérico (1.1030402) conocido como "significando", multiplicado por una potencia de 10 (E5, que significa 105 o 100,000), conocido como "exponente". Si tenemos un exponente negativo, eso significa que el número se multiplica por un 1 que muchos lugares a la derecha del punto decimal. Por ejemplo:

2.3434E−6 = 2.3434 × 10−6 = 2.3434 × 0,000001 = 0,00000234

La ventaja de este esquema es que al usar el exponente podemos obtener un rango de números mucho más amplio, incluso si el número de dígitos en la significada, o la "precisión numérica", es mucho menor que el rango. Se pueden definir formatos de coma flotante binarios similares para computadoras. Hay una serie de tales esquemas, el más popular ha sido definido por el Instituto de Ingenieros Eléctricos y Electrónicos (IEEE). La especificación estándar IEEE 754-2008 define un formato de punto flotante de 64 bits con:

Veamos cómo se ve este formato mostrando cómo se almacenaría dicho número en 8 bytes de memoria:

byte 0 Sx10x9x8x7x6x5x4
byte 1 x3x2x1x0m51m50m49m48
byte 2 m47m46m45m44m43m42m41m40
byte 3 m39m38m37m36m35m34m33m32
byte 4 m31m30m29m28m27m26m25m24
byte 5 m23m22m21m20m19m18m17m16
byte 6 m15m14m13m12m11m10m9m8
byte 7 m7m6m5m4m3m2m1m0

donde "S" denota el bit de signo, "x" denota un bit de exponente y "m" denota un bit significativo. Una vez que se han extraído los bits aquí, se convierten con el cálculo:

Identificar confianza × (1 + 0 significand significativo) × 2− 1023

Este esquema proporciona números válidos hasta aproximadamente 15 dígitos decimales, con el siguiente rango de números:

máximo mínimo
positivo 1.797693134862231E+308 4.940656458412465E-324
negativo -4.940656458412465E-324 -1.797693134862231E+308

La especificación también define varios valores especiales que no son números definidos y se conocen como NaNs, por "No es un número". Estos son utilizados por programas para designar operaciones inválidas y similares.

Algunos programas también usan números de coma flotante de 32 bits. El esquema más común utiliza una mantisa de 23 bits con un bit de signo, más un exponente de 8 bits en "excess-127" formato, dando siete dígitos decimales válidos.

byte 0 Sx7x6x5x4x3x2x1
byte 1 x0m22m21m20m19m18m17m16
byte 2 m15m14m13m12m11m10m9m8
byte 3 m7m6m5m4m3m2m1m0

Los bits se convierten a un valor numérico con el cálculo:

Identificar confianza × (1 + 0 significand significativo) × 2" −

lo que lleva al siguiente rango de números:

máximo mínimo
positivo 3.402823E+38 2.802597E-45
negativo -2.802597E-45 -3.402823E+38

Estos números de coma flotante se conocen como "reales" o "flotadores" en general, pero con una serie de variaciones:

Un valor flotante de 32 bits a veces se denomina "real32" o un "único", que significa "valor de punto flotante de precisión simple".

Un flotante de 64 bits a veces se denomina "real64" o un "doble", que significa "valor de punto flotante de doble precisión".

La relación entre números y patrones de bits se elige por conveniencia en la manipulación informática; ocho bytes almacenados en la memoria de la computadora pueden representar un real de 64 bits, dos reales de 32 bits, o cuatro enteros con o sin signo, o algún otro tipo de datos que caben en ocho bytes. La única diferencia es cómo la computadora los interpreta. Si la computadora almacenó cuatro números enteros sin signo y luego los leyó de la memoria como un número real de 64 bits, casi siempre sería un número real perfectamente válido, aunque sería información basura.

Solo se puede representar un rango finito de números reales con un número determinado de bits. Las operaciones aritméticas pueden desbordarse o subdesbordarse, produciendo un valor demasiado grande o demasiado pequeño para ser representado.

La representación tiene una precisión limitada. Por ejemplo, solo se pueden representar 15 dígitos decimales con un real de 64 bits. Si se suma un número de punto flotante muy pequeño a uno grande, el resultado es solo el grande. El pequeño número era demasiado pequeño para mostrarse incluso en 15 o 16 dígitos de resolución, y la computadora efectivamente lo descarta. Analizar el efecto de la precisión limitada es un problema bien estudiado. Las estimaciones de la magnitud de los errores de redondeo y los métodos para limitar su efecto en cálculos grandes son parte de cualquier proyecto de computación grande. El límite de precisión es diferente del límite de rango, ya que afecta el significado, no el exponente.

La mantisa es una fracción binaria que no necesariamente coincide perfectamente con una fracción decimal. En muchos casos, una suma de potencias recíprocas de 2 no coincide con una fracción decimal específica, y los resultados de los cálculos serán ligeramente erróneos. Por ejemplo, la fracción decimal "0.1" es equivalente a una fracción binaria que se repite infinitamente: 0.000110011...

Números en lenguajes de programación

La programación en lenguaje ensamblador requiere que el programador realice un seguimiento de la representación de los números. Cuando el procesador no admite una operación matemática requerida, el programador debe elaborar un algoritmo adecuado y una secuencia de instrucciones para llevar a cabo la operación; en algunos microprocesadores, incluso la multiplicación de números enteros debe realizarse mediante software.

Los lenguajes de programación de alto nivel como Ruby y Python ofrecen un número abstracto que puede ser un tipo expandido como racional, bignum o complejo. Las operaciones matemáticas se llevan a cabo mediante rutinas de biblioteca proporcionadas por la implementación del lenguaje. Un símbolo matemático dado en el código fuente, por sobrecarga de operadores, invocará diferentes códigos objeto apropiados a la representación del tipo numérico; Las operaciones matemáticas en cualquier número, ya sea con signo, sin signo, racional, de punto flotante, de punto fijo, integral o complejo, se escriben exactamente de la misma manera.

Algunos lenguajes, como REXX y Java, proporcionan operaciones de punto flotante decimal, que proporcionan errores de redondeo de una forma diferente.

Notas y referencias

La versión inicial de este artículo se basó en un artículo de dominio público del sitio de vectores de Greg Goebel.