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 1010, porque usa 1010 dígitos y los coeficientes se multiplican por potencias de 1010.
El sistema binario es base 22, porque usa 22 dígitos (los coeficientes solo pueden ser 010 \lor 1).
Cada coeficiente aja_j se multiplica por 2j2^j.

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

10nan+104a4+103a3+102a2+101a1+100a0+101a1+102a2+103a3++10nan10^{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}

Donde ana_{n} es el coeficiente más grande y ana_{-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:

2nan+24a4+23a3+22a2+21a1+20a0+21a1+22a2+23a3++2nan\begin{aligned} &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{aligned}

Un ejemplo de número decimal a binario es 13.62=(1101)213.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:

  1101+101111000  11011011  0010  1101×    101    11010000    1101  1000001\begin{aligned} &\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{aligned}

Como no es posible 1+1=21+1=2 en binario, se deja un 00 y se lleva un 11 al siguiente coeficiente.

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

Conversiones de base numérica

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

Ejemplo: Convertir 0.68750.6875 a binario y a base 88.

0.6875×2=1+0.375    a1=10.375×2=0+0.75    a2=00.75×2=1+0.5    a3=10.5×2=1+0    a4=1\begin{aligned} 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{aligned}

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

0.6875×8=5+0.5    a1=50.5×8=4+0    a2=4\begin{aligned} 0.6875 \times 8 &= 5 + 0.5 &\implies a_{-1} = 5 \\ 0.5 \times 8 &= 4 + 0 &\implies a_{-2} = 4 \\ \end{aligned}

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

Números Octales y Hexadecimales

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

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


DecimalBinarioOctalHexadecimal
00000000000000
11000100011111
22001000102222
33001100113333
44010001004444
55010101015555
66011001106666
77011101117777
8810001000101088
9910011001111199
1010101010101212AA
1111101110111313BB
1212110011001414CC
1313110111011515DD
1414111011101616EE
1515111111111717FF

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

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

(1101.1011)2=(001  101  .001  011)2=(15.13)8=(D.5)8(1101.1011)2=(D.B)16\begin{aligned} (1101.1011)_2 &= (001 \; 101 \; .001 \; 011)_2 = (15.13)_8 = (D.5)_8 \\ &\\ (1101.1011)_2 &= (D.B)_{16} \end{aligned}

Puede darse el caso que el número no sea exactamente divisible por 33 o 44, 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(11010011011011)_2 y (0.101101)2(0.101101)_2 en hexadecimal.

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

Ejercicios resueltos - Conversión de base numérica

1.

Convertir el siguiente número hexadecimal a binario de 3232 bits: 0x10A6F2B0x10A6F2B

0x10A6F2B=(0001  0000  1010  0110  1111  0010  1011)2=0x10A6F2B = (0001 \; 0000 \; 1010 \; 0110 \; 1111 \; 0010 \; 1011)_2 =

2.

Convertir el siguiente número decimal a binario: 123123

123=261+161=230+130=215+015=27+17=23+13=21+11=20+1\begin{aligned} 123 = 2 \cdot 61 + 1 \\ 61 = 2 \cdot 30 + 1 \\ 30 = 2 \cdot 15 + 0 \\ 15 = 2 \cdot 7 + 1 \\ 7 = 2 \cdot 3 + 1 \\ 3 = 2 \cdot 1 + 1 \\ 1 = 2 \cdot 0 + 1 \\ \end{aligned}

Tenemos que 123=(1111011)2123 = (1111011)_2.


3.

Suponiendo que se tienen registros de 1616 bits, convertir el siguiente número decimal: 255,46255,46 a binario sin signo.

255=2127+1127=263+163=231+131=215+115=27+17=23+13=21+11=20+1\begin{aligned} 255 = 2 \cdot 127 + 1 \\ 127 = 2 \cdot 63 + 1 \\ 63 = 2 \cdot 31 + 1 \\ 31 = 2 \cdot 15 + 1 \\ 15 = 2 \cdot 7 + 1 \\ 7 = 2 \cdot 3 + 1 \\ 3 = 2 \cdot 1 + 1 \\ 1 = 2 \cdot 0 + 1 \\ \end{aligned} 0.462=0+0.920.922=1+0.840.842=1+0.680.682=1+0.360.362=0+0.720.722=1+0.440.442=0+0.880.882=1+0.76\begin{aligned} 0.46 \cdot 2 &= 0 + 0.92 \\ 0.92 \cdot 2 &= 1 + 0.84 \\ 0.84 \cdot 2 &= 1 + 0.68 \\ 0.68 \cdot 2 &= 1 + 0.36 \\ 0.36 \cdot 2 &= 0 + 0.72 \\ 0.72 \cdot 2 &= 1 + 0.44 \\ 0.44 \cdot 2 &= 0 + 0.88 \\ 0.88 \cdot 2 &= 1 + 0.76 \\ \end{aligned}

Tenemos que 255.46=(11111111.01110101)2255.46 = (11111111.01110101)_2.

Complementos

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

El complemento a 11 se obtiene cambiando los 00 por 11 y los 11 por 00.
El complemento a 22 se obtiene sumando 11 al complemento a 11

Ejemplo:

El complemento a 11 de (1101)2(1101)_2 es (0010)2(0010)_2.
El complemento a 22 de (1101)2(1101)_2 es (0011)2(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 11 y luego se vuelve a colocar en su lugar.

Ejemplo:

El complemento a 11 de (1101.1011)2(1101.1011)_2 es (0010.0100)2(0010.0100)_2.


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

Ejemplo: Convertir 63-63 a binario, donde su tamaño de registro es de 88 bits.

Primero calculamos el valor absoluto de 6363 en binario y agregamos ceros a la izquierda para completar los 88 bits.

63=(00111111)263 = (00111111)_2

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

(00111111)2    (11000000)2+1    (11000001)2\begin{aligned} (00111111)_2 &\implies (11000000)_2 \\ +1 &\implies (11000001)_2 \end{aligned}

Por lo que 63=(11000001)2-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 22 del sustraendo y sumar ambos números.


Ejercicios resueltos - Complementos

1.

Suponiendo que un microprocesador utiliza registros de 88 bits y representación de números negativos en complemento a 22, convertir el número decimal 76-76 a binario.

Primero calculamos el valor de 7676 en binario.

76=238+038=219+019=29+19=24+14=22+02=21+01=20+1\begin{aligned} 76 = 2 \cdot 38 + 0 \\ 38 = 2 \cdot 19 + 0 \\ 19 = 2 \cdot 9 + 1 \\ 9 = 2 \cdot 4 + 1 \\ 4 = 2 \cdot 2 + 0 \\ 2 = 2 \cdot 1 + 0 \\ 1 = 2 \cdot 0 + 1 \\ \end{aligned}

Tenemos que 76=(01001100)276 = (01001100)_2, se agrega un cero a la izquierda para completar los 88 bits. Ahora obtenemos el complemento a 11 de (01001100)2(01001100)_2.

(01001100)2    (10110011)2(01001100)_2 \implies (10110011)_2

Ahora sumamos 11 al complemento a 11 para obtener el complemento a 22.

(10110011)2    (10110011)2+1    (10110100)2\begin{aligned} (10110011)_2 &\implies (10110011)_2 \\ +1 &\implies (10110100)_2 \end{aligned}

Por lo que 76=(10110100)2-76 = (10110100)_2.


2.

Convertir el siguiente valor signado de 88 bits a decimal: (10010110)2(10010110)_2.

Revertimos la suma y obtenemos el complemento a 11 de (10010110)2(10010110)_2.

(10010110)21    (10010101)2(10010110)_2 - 1 \implies (10010101)_2

Ahora cambiamos 11 por 00

(10010101)2    (01101010)2(10010101)_2 \implies (01101010)_2

Ahora convertimos el número binario a decimal.

=027+126+125+024+123+022+121+020=0+64+32+0+8+0+2+0=106\begin{aligned} &= 0 \cdot 2^7 + 1 \cdot 2^6 + 1 \cdot 2^5 + 0 \cdot 2^4 + 1 \cdot 2^3 + 0 \cdot 2^2 + 1 \cdot 2^1 + 0 \cdot 2^0 \\ &= 0 + 64 + 32 + 0 + 8 + 0 + 2 + 0 \\ &= 106 \end{aligned}

Con el signo negativo, tenemos que (10010110)2=106(10010110)_2 = -106.


3.

Dar el resultado de la operación 0x800x80 - 0xD00xD0 en decimal, donde se usan registros de 88 bits y representación de números negativos en complemento a 22.

Primero convertimos ambos números hexadecimales a binario

0x80=(10000000)20xD0=(11010000)20x80 = (10000000)_2 \\ 0xD0 = (11010000)_2

Ahora obtenemos el complemento a 22 de (11010000)2(11010000)_2

(11010000)2    (00101111)2+1    (00110000)2\begin{aligned} (11010000)_2 &\implies (00101111)_2 \\ +1 &\implies (00110000)_2 \end{aligned}

Ambos números en decimal son:

(10000000)2=27=128(00110000)2=25+24=48\begin{aligned} (10000000)_2 &= 2^7 = 128 \\ (00110000)_2 &= 2^5 + 2^4 = -48 \end{aligned}

La resta 0x800x80 - 0xD00xD0 se puede expresar como 128+(48)=80128 + (-48) = 80. En binario, 8080 es

80=240+040=220+020=210+010=25+05=22+12=21+01=20+1\begin{aligned} 80 = 2 \cdot 40 + 0 \\ 40 = 2 \cdot 20 + 0 \\ 20 = 2 \cdot 10 + 0 \\ 10 = 2 \cdot 5 + 0 \\ 5 = 2 \cdot 2 + 1 \\ 2 = 2 \cdot 1 + 0 \\ 1 = 2 \cdot 0 + 1 \\ \end{aligned}

Tenemos que 80=(01010000)280 = (01010000)_2.

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(1+F)2EBx = (-1)^{s} \cdot (1 + F) \cdot 2^{E - B}
  • ss corresponde a un bit de signo.
  • FF es la mantisa, un número fraccionario. Si es de precisión simple, se usan 2323 bits y si es de precisión doble, se usan 5252 bits.
  • EE es el exponente, un número entero. Si es de precisión simple, se usan 88 bits y si es de precisión doble, se usan 1111 bits. Su valor se calcula como E=e+BE = e + B, donde ee es el valor del exponente y BB 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=127B = 127 y en precisión doble, B=1023B = 1023.

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

13.625=1101.101113.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     e=3\implies e=3

=1.1011011×23=1.1011011×2(130127)\begin{aligned} &= 1.1011011 \times 2^3 \\ &= 1.1011011 \times 2^{(130 - 127)} \end{aligned}

Tenemos que:

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

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

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 =1111= 111 \ldots 1, y mantisa =0000= 000 \ldots 0.
Este se utiliza cuando un número excede el rango de representación.

El NaN se representa con exponente =1111= 111 \ldots 1, y mantisa char"338=0000\not=000 \ldots 0.
Este se utiliza cuando se realiza una operación inválida, como dividir por 00.


Ejercicios resueltos - Números flotantes

1.

Convertir el siguiente número decimal a formato IEEE 754 de precisión simple: 56785678 (normalizado).

Primero convertimos el número decimal a binario.

5678=22839+02839=21419+11419=2709+1709=2354+1354=2177+0177=288+188=244+044=222+022=211+011=25+15=22+12=21+01=20+1\begin{aligned} 5678 = 2 \cdot 2839 + 0 \\ 2839 = 2 \cdot 1419 + 1 \\ 1419 = 2 \cdot 709 + 1 \\ 709 = 2 \cdot 354 + 1 \\ 354 = 2 \cdot 177 + 0 \\ 177 = 2 \cdot 88 + 1 \\ 88 = 2 \cdot 44 + 0 \\ 44 = 2 \cdot 22 + 0 \\ 22 = 2 \cdot 11 + 0 \\ 11 = 2 \cdot 5 + 1 \\ 5 = 2 \cdot 2 + 1 \\ 2 = 2 \cdot 1 + 0 \\ 1 = 2 \cdot 0 + 1 \\ \end{aligned}

Tenemos que 5678=(1011000101110)25678 = (1011000101110)_2. Ahora identificamos los valores de s,F,Es, F, E.

  • s=0s = 0 (es positivo)

Este número no tiene parte fraccionaria, por lo que el desplazamiento del punto es de e=12    1.011000101110e = 12 \implies 1.011000101110

  • F=01100010111000000000000F = 01100010111000000000000 (agregamos ceros para llegar a 2323 bits)

Finalmente, calculamos el valor de EE.

E=e+B=12+127=139=27+23+22+21+20=(10001011)2\begin{aligned} E &= e + B \\ &= 12 + 127 \\ &= 139 = 2^7 + 2^3 + 2^2 + 2^1 + 2^0 = (10001011)_2 \end{aligned}

El número 56785678 en formato IEEE 754 de precisión simple es (0  10001011  01100010111000000000000)2(0 \; 10001011 \; 01100010111000000000000)_2.


2.

Convertir el siguiente número decimal a formato IEEE 754 de precisión simple: 3020.993-3020.993 (normalizado).

Primero convertimos el número decimal a binario. Este número tiene parte entera y parte fraccionaria, por lo que se convierten por separado.
La mantisa debe tener 2323 bits, por lo que nos interesan los primeros 2424 bits para hacer el desplazamiento del punto.

3020=21510+01510=2755+0755=2377+1377=2188+1188=294+094=247+047=223+123=211+111=25+15=22+12=21+01=20+1\begin{aligned} 3020 = 2 \cdot 1510 + 0 \\ 1510 = 2 \cdot 755 + 0 \\ 755 = 2 \cdot 377 + 1 \\ 377 = 2 \cdot 188 + 1 \\ 188 = 2 \cdot 94 + 0 \\ 94 = 2 \cdot 47 + 0 \\ 47 = 2 \cdot 23 + 1 \\ 23 = 2 \cdot 11 + 1 \\ 11 = 2 \cdot 5 + 1 \\ 5 = 2 \cdot 2 + 1 \\ 2 = 2 \cdot 1 + 0 \\ 1 = 2 \cdot 0 + 1 \\ \end{aligned}

Tenemos que 3020=(101111001100)23020 = (101111001100)_2. Ahora convertimos la parte fraccionaria.

0.9932=1+0.9860.9862=1+0.9720.9722=1+0.9440.9442=1+0.8880.8882=1+0.7760.7762=1+0.5520.5522=1+0.1040.1042=0+0.2080.2082=0+0.4160.4162=0+0.8320.8322=1+0.6640.6642=1+0.328\begin{aligned} 0.993 \cdot 2 &= 1 + 0.986 \\ 0.986 \cdot 2 &= 1 + 0.972 \\ 0.972 \cdot 2 &= 1 + 0.944 \\ 0.944 \cdot 2 &= 1 + 0.888 \\ 0.888 \cdot 2 &= 1 + 0.776 \\ 0.776 \cdot 2 &= 1 + 0.552 \\ 0.552 \cdot 2 &= 1 + 0.104 \\ 0.104 \cdot 2 &= 0 + 0.208 \\ 0.208 \cdot 2 &= 0 + 0.416 \\ 0.416 \cdot 2 &= 0 + 0.832 \\ 0.832 \cdot 2 &= 1 + 0.664 \\ 0.664 \cdot 2 &= 1 + 0.328 \\ \end{aligned}
  • s=0s = 0 (es positivo)

El número 3020,993=(101111001100.111111100011)23020,993 = (101111001100.111111100011)_2. El desplazamiento del punto es de e=11    1.011110011001111111100011e = 11 \implies 1.011110011001111111100011

  • F=01111001100111111110001F = 01111001100111111110001

Finalmente, calculamos el valor de EE.

E=e+B=11+127=138=27+23+22+21=(10001010)2\begin{aligned} E &= e + B \\ &= 11 + 127 \\ &= 138 = 2^7 + 2^3 + 2^2 + 2^1 = (10001010)_2 \end{aligned}

El número 3020.993-3020.993 en formato IEEE 754 de precisión simple es (1  10001010  01111001100111111110011)2(1 \; 10001010 \; 01111001100111111110011)_2.