Skip to Content
Organización del ComputadorSistemas de Numeración

Sistemas de Numeración

Números Decimales y Binarios

Para seguir con este tema, es útil repasar esta sección: Desarrollos en base b (MD1)

El sistema numérico decimal es base \(10\), porque usa \(10\) dígitos y los coeficientes se multiplican por potencias de \(10\).
El sistema binario es base \(2\), porque usa \(2\) dígitos (los coeficientes solo pueden ser \(0 \lor 1\)).
Cada coeficiente \(a_j\) se multiplica por \(2^j\).

Un número con punto decimal se representa con una serie de coeficientes:

\[\begin{align} &a_{n} \; a_{4} \; a_{3} \; a_{2} \; a_{1} \; a_{0} \; .a_{-1} \; a_{-2} \; a_{-3} \; \ldots a_{-n} \; \\ &10^{n}a_{n} + 10^{4}a_{4} + 10^{3}a_{3} + 10^{2}a_{2} + 10^{1}a_{1} + 10^{0}a_{0} + 10^{-1}a_{-1} + 10^{-2}a_{-2} + 10^{-3}a_{-3} + \ldots + 10^{-n}a_{-n} \\ \end{align} \]

Donde \(a_{n}\) es el coeficiente más grande y \(a_{-n}\) es el coeficiente más pequeño.
El punto decimal se usa para separar la parte entera de la parte fraccionaria.

El sistema binario sería:

\[\begin{align} &2^{n}a_{n} + 2^{4}a_{4} + 2^{3}a_{3} + 2^{2}a_{2} + 2^{1}a_{1} + 2^{0}a_{0} + 2^{-1}a_{-1} + 2^{-2}a_{-2} + 2^{-3}a_{-3} + \ldots + 2^{-n}a_{-n} \\ \end{align} \]

Un ejemplo de número decimal a binario es \(13.62 = (1101)_{2}\). En lugar de denominar a los binarios como binary digits se les llama bits.

Podemos realizar operaciones aritméticas con números binarios de la siguiente forma:

\[\begin{align} &\quad \; 1101 \\ &+1011 \\ &\quad \overline{11000} \\ &\\ &\quad \; 1101 \\ &-1011 \\ &\quad\overline{\;0010} \\ & \\ &\quad \; 1101 \\ &\times \;\; 101 \\ &\quad \overline{\;\; 1101} \\ &\quad 0000 \\ &\;\; 1101 \\ &\overline{\; 1000001} \\ \end{align} \]

Como no es posible \(1+1=2\) en binario, se deja un \(0\) y se lleva un \(1\) al siguiente coeficiente.

Existen distintos registros (tamaños de bits) para representar números binarios, como los bytes (\(8\) bits).

Conversiones de base numérica

La conversión de una fracción decimal a un número en base \(r\), pero en lugar de dividir se multiplica por \(r\) y se toma la parte entera.

Ejemplo: Convertir \(0.6875\) a binario y a base \(8\).

\[\begin{align} 0.6875 \times 2 &= 1 + 0.375 &\implies a_{-1} = 1 \\ 0.375 \times 2 &= 0 + 0.75 &\implies a_{-2} = 0 \\ 0.75 \times 2 &= 1 + 0.5 &\implies a_{-3} = 1 \\ 0.5 \times 2 &= 1 + 0 &\implies a_{-4} = 1 \\ \end{align} \]

Tenemos que \(0.6875 = (0.1011)_2\).

\[\begin{align} 0.6875 \times 8 &= 5 + 0.5 &\implies a_{-1} = 5 \\ 0.5 \times 8 &= 4 + 0 &\implies a_{-2} = 4 \\ \end{align} \]

Tenemos que \(0.6875 = (0.54)_8\).

Números Octales y Hexadecimales

Las conversiones entre binario, octal y hexadecimal son fundamentales en las computadoras, ya que \(2^3 = 8 \land 2^4 = 16\). Por lo que cada dígito en octal representa \(3\) bits y cada dígito en hexadecimal representa \(4\) bits.

La siguiente tabla muestra los núemros con diferente base:


DecimalBinarioOctalHexadecimal
\(0\)\(0000\)\(0\)\(0\)
\(1\)\(0001\)\(1\)\(1\)
\(2\)\(0010\)\(2\)\(2\)
\(3\)\(0011\)\(3\)\(3\)
\(4\)\(0100\)\(4\)\(4\)
\(5\)\(0101\)\(5\)\(5\)
\(6\)\(0110\)\(6\)\(6\)
\(7\)\(0111\)\(7\)\(7\)
\(8\)\(1000\)\(10\)\(8\)
\(9\)\(1001\)\(11\)\(9\)
\(10\)\(1010\)\(12\)\(A\)
\(11\)\(1011\)\(13\)\(B\)
\(12\)\(1100\)\(14\)\(C\)
\(13\)\(1101\)\(15\)\(D\)
\(14\)\(1110\)\(16\)\(E\)
\(15\)\(1111\)\(17\)\(F\)

Podemos hacer conversiones de base numérica acomodando los dígitos de forma correspondiente.

Ejemplo: Convertir \((1101.1011)_2\) a octal y hexadecimal.

\[\begin{align} (1101.1011)_2 &= (001 \; 101 \; .001 \; 011)_2 = (15.13)_8 = (D.5)_8 \\ &\\ (1101.1011)_2 &= (D.B)_{16} \end{align} \]

Puede darse el caso que el número no sea exactamente divisible por \(3\) o \(4\), por lo que se agregan ceros a la izquierda (en la parte entera) o a la derecha (en la parte fraccionaria) para completar el número.

Ejemplo: Expresar \((11010011011011)_2\) y \((0.101101)_2\) en hexadecimal.

\[\begin{align} (11010011011011)_2 &= 1011 \; 0011 \; 0110 \; 11 = 1011 \; 0011 \; 0110 \; 0011 = (B36B)_{16} \\ &\\ (0.101101)_2 &= 1011 \; 01 = 1011 \; 0100 = (0.B4)_{16} \end{align} \]

Complementos

Los complementos son una forma de representar números negativos.
Dado un número \(N\) en base \(r\) con \(n\) dígitos, el complemento a \((r - 1)\) es \((r^n - 1) - N\).
En el caso de los binarios \(r = 2 \land r - 1 = 1\), por lo que el complemento a \(1\) es \((2^n - 1) - N\).

El complemento a \(1\) se obtiene cambiando los \(0\) por \(1\) y los \(1\) por \(0\).
El complemento a \(2\) se obtiene sumando \(1\) al complemento a \(1\)

Ejemplo:

El complemento a \(1\) de \((1101)_2\) es \((0010)_2\).
El complemento a \(2\) de \((1101)_2\) es \((0011)_2\).

En la definición anterior se considera que el número no lleva punto. De ser el caso, se quita temporalmente para formar el complemento a \(1\) y luego se vuelve a colocar en su lugar.

Ejemplo:

El complemento a \(1\) de \((1101.1011)_2\) es \((0010.0100)_2\).


Podemos expresar un número decimal negativo a binario (negativos en complemento a \(2\)):

Ejemplo: Convertir \(-63\) a binario, donde su tamaño de registro es de \(8\) bits.

Primero calculamos el valor absoluto de \(63\) en binario y agregamos ceros a la izquierda para completar los \(8\) bits.

\[63 = (00111111)_2 \]

Ahora obtenemos el complemento a \(2\) de \((00111111)_2\).

\[\begin{align} (00111111)_2 &\implies (11000000)_2 \\ +1 &\implies (11000001)_2 \end{align} \]

Por lo que \(-63 = (11000001)_2\).

Si quisiéramos aumentar el tamaño del registro, al ser negativo, se agregan unos a la izquierda.


Para hacer una resta entre dos números binarios, es más sencillo hacer el complemento a \(2\) del sustraendo y sumar ambos números.

Números Flotantes

Los números flotantes son una representación de números reales extremadamente grandes o pequeños en notación científica. Este formato puede ser de precisión simple o doble, dependiendo de la cantidad de bits que se usen. En lenguajes como C se usan los tipos float y double para representarlos.

Su formato sería el siguiente:

\[x = (-1)^{s} \times (1 + F) \times 2^{E - B} \]
  • \(s\) corresponde a un bit de signo.
  • \(F\) es la mantisa, un número fraccionario. Si es de precisión simple, se usan \(23\) bits y si es de precisión doble, se usan \(52\) bits.
  • \(E\) es el exponente, un número entero. Si es de precisión simple, se usan \(8\) bits y si es de precisión doble, se usan \(11\) bits. Su valor se calcula como \(E = e + B\), donde \(e\) es el valor del exponente y \(B\) es el sesgo.
  • El sesgo es un número que se le suma al exponente para que no sea negativo. En precisión simple, \(B = 127\) y en precisión doble, \(B = 1023\).

Por ejemplo, el número \(-13.625\) en precisión simple sería:

\[13.625 = 1101.1011 \]

Para seguir el formato, necesitamos desplazar el \(.\) cuantas veces sea necesario para solo tener una unidad entera. En este caso, tres veces \(\implies e=3\)

\[\begin{align} &= 1.1011011 \times 2^3 \\ &= 1.1011011 \times 2^{(130 - 127)} \end{align} \]

Tenemos que:

  • \(s = 1\) (es negativo)
  • \(F = 10110110000000000000000\) (agregamos ceros para llegar a \(23\) bits)
  • \(E = 130 = (10000110)_2\)

Sumando todos los bits, tenemos \(32\) bits. Agrupando \(s, E, F\) (en ese orden) de a cuatro podemos dar con el número hexadecimal \(0xC15A0000\)

Infinitos y NaN

En los números flotantes, existen valores especiales como el infinito y el NaN (Not a Number).

El \(\pm \infty\) se representa con exponente \(= 111 \ldots 1\), y mantisa \(= 000 \ldots 0\).
Este se utiliza cuando un número excede el rango de representación.

El NaN se representa con exponente \(= 111 \ldots 1\), y mantisa \(\neq 000 \ldots 0\).
Este se utiliza cuando se realiza una operación inválida, como dividir por \(0\).

Última vez actualizado el 2 de mayo de 2025