Archivo de la categoría: Datos

Los datos describen hechos empíricos, sucesos y entidades. Representan la información que el programador manipula en la construcción de una solución o en el desarrollo de un algoritmo

Dato

Dato

Un dato es todo aquello que nos aporta conocimiento sobre algo: números, letras, símbolos, imágenes, sonidos…

Los datos tienen que quedar almacenados en la memoria de la máquina para que este pueda trabajar con ellos. La codificación de los datos en la memoria de la máquina será en base al tipo que tenga el dato: entero, real, carácter, etc. No solo se almacenan los datos sino también las instrucciones. Se trata de ver como la máquina representa internamente la información

Los circuitos electrónicos que forman la máquina solo son capaces de distinguir entre dos valores (ON / OFF, SI / NO, VERDAD / FALSO). Estos dos valores se implementan físicamente como paso de corriente, no paso de corriente. Distinguir entre un mayor número de niveles de voltaje facilitaría la producción de errores. Por esto, los métodos de codificación internos deben utilizar solo dos símbolos, la codificación binaria

Los caracteres alfanuméricos (conjunto de caracteres alfabéticos y numéricos, aunque por lo general, se asume que incluye además el resto de caracteres disponibles en el sistema, incluyendo así los caracteres gráficos y de control) se representan con códigos en un tipo de representación numérica, también llamadas tablas de códigos o tablas de representación, ASCII, EBCDIC, etc

Así dependiendo del código de representación usado hablaremos que al carácter A le corresponde un código decimal / binario / octal / hexadecimal

Sistema Decimal

Sistema decimal

El sistema decimal tiene de base 10 y se representa por el conjunto {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. El nombre usado por cada uno de los símbolos es dígito

Cuando combinamos varios dígitos, tenemos un número. Su valor depende no sólo del valor de cada uno de ellos, sino de la posición que tienen dentro de su conjunto

El paso de cualquier número a base 10, correspondería a aplicar la fórmula:

b_1\cdot 10^{(n-1)}+\cdots+b_n\cdot 10^0

Donde n seria la longitud de la cadena, y b_i, el valor correspondiente a la posición i-ésima de la ristra, empezando de izquierda a derecha

Ejemplo: Representación del número 3737 en sistema decimal

3737=3\cdot 10^3+7\cdot 10^2+3\cdot 10^1+3\cdot 10^0

Representación con decimales

Si el número tiene además decimales, se expresará con la siguiente fórmula:

b_1\cdot 10^{(n-1)}+\cdots+b_n\cdot 10^0+b_{n+1}\cdot 10^{-1}+\cdots+b_{n+m}\cdot 10^{-m}

Donde n seria la longitud de la cadena sin decimales, m la longitud de la cadena con decimales, b_i, el valor correspondiente a la posición i-ésima de la ristra, empezando de izquierda a derecha

Ejemplo: Representación del número 56,34 en sistema decimal

56,34=5\cdot 10^1+6\cdot 10^0+3\cdot 10^{-1}+4\cdot 10{-2}

Sistema Binario

Sistema binario

El sistema binario tiene base 2 y se representa por el conjunto {0, 1}

El Sistema Internacional de Unidades y el término byte

En los inicios de la informática, las unidades se mostraban como múltiplos de 1000, pero en los años 60 se empezó a confundir 1000 con 1024, puesto que la memoria de los ordenadores trabajan en base binaria y no decimal. El problema radicó al nombrar estas unidades, ya que se adoptaron los nombres de los prefijos del Sistema Internacional de Unidades. Dada la similitud en las cantidades, se utilizaron los prefijos de base mil que se aplican a las unidades del sistema internacional (tales como el metro, el gramo, el voltio o el amperio)

Sin embargo, etimológicamente es incorrecto utilizar estos prefijos (de base decimal) para nombrar múltiplos en base binaria. Como ocurre en el caso del kilobyte, a pesar de que 1024 se aproxime a 1000

Para clarificar la distinción entre los prefijos decimal y binario, la Comisión Electrotécnica Internacional (IEC), un grupo de estandarización, propuso en 1998 otros prefijos, que consistían en uniones abreviadas del Sistema Internacional de Unidades con la palabra binario

Así pues, un conjunto de 2^{10} bytes (1024 bytes), debería ser denominado un kibibyte 4 (KiB) contracción de Kilobyte Binario

Esta convención, expresada en los estándares IEC 60027-2^5\text{ e }IEC 80000-13:2008, ha sido adoptada para el sistema operativo «Snow Leopard» de Apple y por Ubuntu. Otras, como Microsoft, adoptan la definición que se encuentra en diccionarios como el de Oxford, al mantener el uso de «kilobyte» para 1024 bytes

En el entorno informático se ha sugerido utilizar el prefijo K mayúscula para distinguir la cantidad binaria de la decimal, pero este tema aún no se ha normalizado, ya que el símbolo «K» en el SI representa la unidad de temperatura, el kelvin. Por otro lado, esta sugerencia no se podría extender a otros prefijos de mayor magnitud dado que, en el caso del MB (megabyte), el SI ya utiliza tanto la M mayúscula (mega: millón) como la minúscula (mili: milésima)

Unidades de información (del byte)
Sistema Internacional (decimal) ISO/IEC 80000-13 (binario)
Múltiplo (símbolo) SI Múltiplo (símbolo) ISO/IEC
kilobyte (kB) 10^3 kibibyte (KiB) 2^{10}
megabyte (MB) 10^6 mebibyte (MiB) 2^{20}
gigabyte (GB) 10^9 gibibyte (GiB) 2^{30}
terabyte (TB) 10^{12} tebibyte (TiB) 2^{40}
petabyte (PB) 10^{15} pebibyte (PiB) 2^{50}
exabyte (EB) 10^{18} exbibyte (EiB) 2^{60}
zettabyte (ZB) 10^{21} zebibyte (ZiB) 2^{70}
yottabyte (YB) 10^{24} yobibyte (YiB) 2^{80}

En las matemáticas puras un valor no tiene un límite de espacio para su representación, sin embargo, las máquinas generalmente trabajan con un número fijo de bits

Bit

La unidad más pequeña de información en una máquina se le llama bit. Con un bit se puede representar solo un valor de dos posibles valores diferentes, ejemplo: cero o uno, falso o verdadero, blanco o negro, abajo o arriba, no o sí, etc

Nibble

Un nibble es una colección de 4 bits. No sería un tipo de dato interesante a excepción de que con un nibble se presenta un número BCD y también que un nibble puede representar un dígito hexadecimal

Byte

Un byte es una colección de 8 bits. Las referencias hacia cierta localidad de memoria en todos los microprocesadores nunca es menor que un byte, (la mayoría usan múltiplos de bytes), por lo tanto, se considera el dato localizable (direccionable) más pequeño

Los bits de un byte normalmente se numeran desde 0 hasta 7. El bit 0 se le llama bit de más bajo orden o menos significativo, el bit 7 se considera el bit de más alto orden o el más significativo.

Un byte consta también de 2 nibbles, los bits 0, 1, 2 y 3 forman el llamado nibble de menor orden, y los bits 4, 5, 6 y 7 forman el nibble de mayor orden. Como un byte está formado por dos nibbles, es posible representar cualquier valor con dos dígitos hexadecimales

Palabra

Una palabra es un grupo de 16 bits, el bit 0 es el bit de más bajo orden y el bit 15 es el de más alto orden. Una palabra se puede dividir en 2 bytes llamados igualmente de bajo y alto orden. También una palabra puede considerarse como un grupo de 4 nibbles.

Se considera una palabra doble a un grupo de 32 bits

Se considera una palabra cuádruple a un grupo de 64 bits

Los ordenadores modernos normalmente tienen un tamaño de palabra de 16, 32 ó 64 bits. Muchos otros tamaños se han utilizado en el pasado, como 8, 9, 12, 18, 24, 36, 39, 40, 48 y 60 bits. El slab es uno de los ejemplos de uno de los primeros tamaños de palabra. Algunos de los primeros ordenadores eran decimales en vez de binarios, típicamente teniendo un tamaño de palabra de 10 ó 12 dígitos decimales y algunos de los primeros ordenadores no tenían una longitud de palabra fija

Algunas veces, el tamaño de una palabra se define para tener un valor particular por compatibilidad con los ordenadores anteriores. Los microprocesadores utilizados en ordenadores personales (por ejemplo, los Intel Pentium y los AMD Athlon) son un ejemplo

Su arquitectura IA-32 es una extensión del diseño original del Intel 8086 que tenía un tamaño de palabra de 16 bits. Los procesadores IA-32 siguen soportando programas del 8086 (x86), así que el significado de palabra en el contexto IA-32 sigue siendo el mismo y se continua diciendo que son 16 bits, a pesar del hecho de que en la actualidad (el tamaño del operando por defecto es 32 bits) opera más como una máquina con un tamaño de palabra de 32 bits. Similarmente en la nueva arquitectura x86-64, una palabra sigue siendo 16 bits, aunque los operandos de 64 bits (palabra cuádruple) son más comunes

Números enteros

Es posible representar un número finito de números enteros. Por ejemplo, con 8 bits podemos representar 256 objetos diferentes. Si se usara un esquema de números enteros positivos cada uno de éstos objetos se numerarían de 0 a 255

También es posible usar un esquema de números enteros negativos, para este caso se usa el sistema complemento a dos, donde el bit de mayor orden es el bit de signo, si tal bit es cero, el número es positivo, si es uno, el número es negativo. Si el número es positivo es almacenado en su valor binario estándar, si el número es negativo se almacena en su forma complemento a dos

Números reales

La forma en que la arquitectura de computadoras resuelve el problema de representar números reales es por medio de los números de coma flotante. Un número coma flotante se divide en 3 secciones de bits: signo, significante y exponente con signo

Conversiones

Conversión a sistema decimal

La representación binaria de un número decimal (el paso de un número en base 10 a su correspondiente en base 2), se calcula dividiendo sucesivamente el cociente de la división del numero por el divisor 2, hasta obtener un cociente menor a 2. La representación en base 2 será, el último cociente seguido del ultimo resto seguido del resto anterior seguido del resto anterior, y así hasta el primer resto obtenido

Ejemplo: Convertir 3737 a representación binaria

Número Cociente Resto
\frac{3737}{2} 1868 1
\frac{1868}{2} 934 0
\frac{934}{2} 467 0
\frac{467}{2} 233 1
\frac{233}{2} 116 1
\frac{116}{2} 58 0
\frac{58}{2} 29 0
\frac{29}{2} 14 1
\frac{14}{2} 7 0
\frac{7}{2} 3 1
\frac{3}{2} 1 1

Entonces tenemos que:

3737_{(10} = 111010011001_{(2}

Convertir de sistema decimal a binario con decimales

La representación binaria de un número decimal con decimales (el paso de un número en base 10 a su correspondiente en base 2), se calcula multiplicando sucesivamente el número (después los resultados) sin su parte entera por 2, hasta obtener un número sin decimales, hasta una cantidad que se repita periódicamente (en el caso de números periódicos), o hasta un número de dígitos predefinido por la precisión de la máquina. La representación en base 2 será, la parte entera sin modificaciones, después se le añade la coma y por último la parte entera del resultado de las multiplicaciones sucesivas

Ejemplo: Convertir 56,75 a representación binaria con decimales

Número Cociente Resto
\frac{56}{2} 28 0
\frac{28}{2} 14 0
\frac{14}{2} 7 0
\frac{7}{2} 3 1
\frac{3}{2} 1 1

Entonces tenemos que la parte entera es:

56_{(10} = 111000_{(2}

Número Resultado Parte entera
0,75 \cdot 2 1,5 1
(1,5 - 1) \cdot 2 1 1

Entonces tenemos que la parte decimal es:

0,75_{(10} = 11_{(2}

Entonces tenemos que:

56,75_{(10} = 111000,11_{(2}

Convertir de sistema binario a decimal

La representación decimal de un número binario, correspondería a aplicar la fórmula:

b_1\cdot 2^{(n - 1)} + \cdots + b_n \cdot 2^0

Donde n seria la longitud de la cadena y b_i el valor correspondiente a la posición i-ésima de la ristra, empezando de izquierda a derecha

Ejemplo: Convertir 111010011001 a representación decimal

111010011001_{(2}= 1 \cdot 2^{11} + 1 \cdot 2^{10} + 1 \cdot 2^9 + 0 \cdot 2^8 + 1 \cdot 2^7 + 0 \cdot 2^6 + 0 \cdot 2^5 + 1 \cdot 2^4 + 1 \cdot 2^3 + 0 \cdot 2^2 + 0 \cdot 2^1 + 1 \cdot 2^0 = 2048 + 1024 + 512 + 0 + 128 + 0 + 0 + 16 + 8 + 0 + 0 + 1 = 3737_{(10}

Entonces tenemos que:

111010011001_{(2}=3737_{(10}

Convertir de sistema binario a decimal con decimales

Si el número tiene además decimales, se expresará con la siguiente fórmula:

b_1\cdot 2^{(n - 1)} + \cdots + b_n \cdot 2^0+b_{n+1}\cdot 2^{-1} + \cdots + b_{n+m} \cdot 2^{-m}

Donde n seria la longitud de la cadena sin decimales, m la longitud de la cadena con decimales, b_i el valor correspondiente a la posición i-ésima de la ristra, empezando de izquierda a derecha

Ejemplo: Convertir 111000,11 a representación decimal

111000,11_{(2}=1 \cdot 2^5 + 1 \cdot 2^4 + 1 \cdot 2^3 + 0 \cdot 2^2 + 0 \cdot 2^1 + 0 \cdot 2^0 + 1 \cdot 2^{-1} + 1 \cdot 2^{-2} = 32 + 16 + 8 + 0 + 0 + 0 + 0 + 0,5 + 0,25 = 56,75(10

Entonces tenemos que:

111000,11_{(2}=56,75(10

Sistema Octal

Sistema octal

El sistema octal tiene base 8 y se representa por el conjunto {0, 1, 2, 3, 4, 5, 6, 7}

Conversiones

Convertir de sistema decimal a octal

La representación binaria de un número decimal (el paso de un número en base 10 a su correspondiente en base 8), se calcula dividiendo sucesivamente el cociente de la división del numero por el divisor 8, hasta obtener un cociente menor a 8. La representación en base 8 será, el último cociente seguido del ultimo resto seguido del resto anterior seguido del resto anterior y así hasta el primer resto obtenido

Ejemplo: Convertir 3737 a representación octal

Número Cociente Resto
\frac{3737}{8} 467 1
\frac{467}{8} 58 3
\frac{58}{8} 7 2

Entonces tenemos que:

3737_{(10} = 7231_{(8}

Convertir de sistema decimal a octal con decimales

La representación binaria de un número decimal con decimales (el paso de un número en base 10 a su correspondiente en base 8), se calcula multiplicando sucesivamente el número (después los resultados) sin su parte entera por 8, hasta obtener un número sin decimales, hasta una cantidad que se repita periódicamente (en el caso de números periódicos), o hasta un número de dígitos predefinido por la precisión de la máquina. La representación en base 8 será, la parte entera sin modificaciones, después se le añade la coma y por último la parte entera del resultado de las multiplicaciones sucesivas

Ejemplo: Convertir 56,75 a representación octal con decimales

Número Cociente Resto
\frac{56}{8} 7 0

Entonces tenemos que la parte entera es:

56_{(10} = 70_{(8}

Número Resultado Parte entera
0,75 \cdot 8 6 6

Entonces tenemos que la parte decimal es:

0,75_{(10} = 6_{(8}

Entonces tenemos que:

56,75_{(10} = 70,6_{(8}

Convertir de sistema octal a decimal

La representación decimal de un número octal, correspondería a aplicar la fórmula:

b_1 \cdot 8^{(n - 1)} + \cdots + b_n \cdot 8^0

Donde n seria la longitud de la cadena, y b_i el valor correspondiente a la posición i-ésima de la ristra, empezando de izquierda a derecha

Ejemplo: Convertir 7231 a representación decimal

7231_{(8}=7 \cdot 8^3 + 2 \cdot 8^2 + 3 \cdot 8^1 + 1 \cdot 8^0 = 7 \cdot 512 + 2 \cdot 64 + 3 \cdot 8 + 1 \cdot 1 = 3584 + 128 + 24 + 1 = 3737_{(10}

Entonces tenemos que:

7231_{(8}= 3737_{(10}

Convertir de sistema octal a decimal con decimales

Si el número tiene además decimales, se expresará con la siguiente fórmula:

b_1 \cdot 8^{(n - 1)} + \cdots + b_n \cdot 8^0+ b_{(n + 1)} \cdot 8^{-1} + \cdots+ b_{(n + m)} \cdot 8^{-m}

Donde n seria la longitud de la cadena sin decimales, m la longitud de la cadena con decimales, b_i el valor correspondiente a la posición i-ésima de la ristra, empezando de izquierda a derecha

Ejemplo: Convertir 70,6 a representación decimal

70,6_{(8}=7 \cdot 8^1 + 0 \cdot 8^0 + 6 \cdot 8^{-1} = 7 \cdot 8 + 0 \cdot 1 + 6 \cdot 0,125 = 56 + 0,75 = 56,75_{(10}

Entonces tenemos que:

70,6_{(8}= 56,75_{(10}

Sistema Hexadecimal

Sistema Hexadecimal

El sistema hexadecimal tiene base 16 y se representa por el conjunto {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}

Muchos valores en informática se representan en hexadecimal

El valor de un byte se puede representar con dos cifras hexadecimales. Desde el valor 0 decimal como 00, hasta el valor 255 como FF

Cada cuatro cifras binarias se corresponden con una cifra hexadecimal, por eso también corresponde con el valor de un nibble

Conversiones

Convertir de sistema decimal a hexadecimal

La representación hexadecimal de un número decimal (el paso de un número en base 10 a su correspondiente en base 16), se calcula dividiendo sucesivamente el cociente de la división del numero por el divisor 16, hasta obtener un cociente menor a 16. La representación en base 16 será, el último cociente seguido del ultimo resto seguido del resto anterior seguido del resto anterior y así hasta el primer resto obtenido

Para conseguir la conversión, además se utiliza esta tabla para representar los valores:

Tabla de conversión
Decimal Hexadecimal
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 A
11 B
12 C
13 D
14 E
15 F

Ejemplo: Convertir 3737 a representación hexadecimal

Numero Cociente Resto
\frac{3737}{16} 233 9
\frac{233}{16} 14 9

14\rightarrow E
9\rightarrow 9

Entonces tenemos que:

3737_{(10} = E99_{(16}

Convertir de sistema decimal a hexadecimal con decimales

La representación hexadecimal de un número decimal con decimales (el paso de un número en base 10 a su correspondiente en base 16), se calcula multiplicando sucesivamente el número (después los resultados) sin su parte entera por 16, hasta obtener un número sin decimales, hasta una cantidad que se repita periódicamente (en el caso de números periódicos), o hasta un número de dígitos predefinido por la precisión de la máquina. La representación en base 16 será, la parte entera sin modificaciones, después se le añade la coma y por último la parte entera del resultado de las multiplicaciones sucesivas

Ejemplo: Convertir 56,75 a representación hexadecimal con decimales

Número Cociente Resto
\frac{56}{16} 3 8

3\rightarrow 3
8\rightarrow 8

Entonces tenemos que la parte entera es:

56_{(10} = 38_{(16}

Número Resultado Parte entera
0,75 \cdot 16 12 12

12\rightarrow C

Entonces tenemos que la parte decimal es:

0,75_{(10} = C_{(16}

Entonces tenemos que:

56,75_{(10} = 38,C_{(16}

Convertir de sistema hexadecimal a decimal

La representación decimal de un número binario, correspondería a aplicar la fórmula:

b_1 \cdot 16^{(n - 1)} + \cdots + b_n \cdot 16^0

Donde n seria la longitud de la cadena, y b_i el valor correspondiente a la posición i-ésima de la ristra, empezando de izquierda a derecha

Ejemplo: Convertir E99 a representación decimal

E\rightarrow 14
9\rightarrow 9

E99_{(16}=E \cdot 16^2 + 9 \cdot 16^1 + 9 \cdot 16^0 = 14 \cdot 256 + 9 \cdot 16 + 9 \cdot 1 = 3584 + 144 + 9 = 3737_{(10}

Entonces tenemos que:

E99_{(16}=3737_{(10}

Convertir de sistema hexadecimal a decimal con decimales

Si el número tiene además decimales, se expresará con la siguiente fórmula:

b_1 \cdot 16^{(n - 1)} + \cdots + b_n \cdot 16^0 + b_{(n + 1)} * 16^{-1} + \cdots+ b_{(n + m)} \cdot 16^{-m}

Donde n seria la longitud de la cadena sin decimales, m la longitud de la cadena con decimales, b_i el valor correspondiente a la posición i-ésima de la ristra, empezando de izquierda a derecha

Ejemplo: Convertir 38,C a representación decimal

3\rightarrow 14
8\rightarrow 9
C\rightarrow 12

38,C_{(16}=3 \cdot 16^1 + 8 \cdot 16^0 + C \cdot 16^{-1} = 3 \cdot 16 + 8 \cdot 1 + 12 \cdot 0,0625 = 48 + 8 + 0,75 = 56,75_{(10}

Entonces tenemos que:

38,C_{(16}=56,75_{(10}

Signo-Magnitud

Signo-Magnitud

La representación signo-magnitud usa el bit más significativo como bit de signo, facilitando la comprobación de si el entero es positivo o negativo

Existen varias convenciones para representar en una máquina los números enteros en su forma binaria, tanto positivos como negativos

Todas tratan implicar el bit más significativo (el que está más a la izquierda) de la palabra (1 palabra equivale a 8 bits) como un bit de signo

En una palabra de n bits, los n-1 bits de la derecha representan la magnitud del entero

El caso general correspondería a aplicar la fórmula:

A=\begin{cases}\sum\limits_{i=0}^{n} 0^{n-2} \cdot a_i & \text{si }a_{n-1}=0 \\ -\sum\limits_{i=0}^{n} 0^{n-2} \cdot a_i & \text{si }a_{n-1}=1 \end{cases}

La representación signo-magnitud posee varias limitaciones:

  • La suma y la resta requieren tener en cuenta tanto los signos de los números como sus magnitudes relativas para llevar a cabo la operación en cuestión
  • Hay dos representaciones para el número 0:

    \begin{cases} +0_{(10}=00000000_{(2} \\ -0_{(10}=10000000_{(2} \end{cases}

Debido a estas limitaciones, raramente se usa la representación en signo-magnitud para representar los números enteros en una máquina

En su lugar, el esquema más común es la representación en complemento a dos

Conversiones

Ejemplo: Convertir de decimal a signo-magnitud

Vamos a convertir \pm 18 a signo-magnitud, primero lo convertimos a binario

Número Cociente Resto
\frac{18}{2} 9 0
\frac{9}{2} 4 1
\frac{4}{2} 2 0
\frac{2}{2} 1 0

Entonces tenemos que la parte binaria es:

18_{(10} = 10010_{(2}

Ahora le aplicamos la distinción por signo dentro de 1 palabra (recordemos que son 8 bits), entonces tenemos:

\begin{cases} +18_{(10}=00010010_{(2} \\ -18_{(10}=10010010_{(2} \end{cases}

Complemento a dos

Complemento a dos

La representación en complemento a dos, al igual que la representación en signo-magnitud, usa el bit más significativo como bit de signo, facilitando la comprobación de si el entero es positivo o negativo

Difiere de la representación en signo-magnitud en la forma de interpretar los bits restantes

Consideremos un entero A de n bits representado en complemento a dos. Si A es positivo, el bit de signo, a_{n-1} es 0. Los restantes bits representan la magnitud del número de la misma forma que en la representación signo-magnitud, es decir:

\sum\limits_{i=0}^{n} 0^{n-2} \cdot a_i\text{ si }A\geq 0

El número 0 se identifica como positivo y tiene, por tanto, un bit de signo 0 y una magnitud de todo ceros. El rango de los enteros positivos que pueden representarse es, desde 0 (todos los bits son 0) hasta 2^{n-1}-1 (todos los bits son 1). Cualquier número mayor requeriría más bits

Para un número A negativo, el bit de signo, a_n-1 es 1. Los n-1 bits restantes pueden tomar cualquiera de las 2^{n-1} combinaciones. Por lo tanto, los enteros negativos pueden representarse desde -1 hasta (-2)^{n-1}, es decir:

A=(-2)^{n-1}\cdot a_{n-1}

Sería deseable asignar los bits de los enteros negativos de tal manera que su manipulación aritmética pudiera efectuarse de una forma directa, similar a la de los enteros sin signo. En la representación sin signo, para calcular el valor de un entero a partir de su expresión en bits, el peso más significativo es 2^{n-1}

El caso general correspondería a aplicar la fórmula:

A=(-2)^{n-1} \cdot a_{n-1} + \sum\limits_{i=0}^{n} 0^{n-2} \cdot a_i

Propiedades

  • Rango de valores
    (-2)^{n-1}\text{ a } 2^{n-1}-1
  • Número de representaciones del 0
    Única
  • Negación
    Ejecutar el complemento booleano de cada bit y sumar 1 al patrón de bits resultante
  • Ampliación de la longitud en bits
    Las posiciones extra se añaden a la izquierda, rellenandolas con el valor del bit de signo original
  • Regla del desbordamiento
    Si se suman dos números de igual signo (ambos positivo ó negativos), hay desbordamiento si y sólo si, el resultado tiene signo opuesto
  • Regla para la resta
    Para restar B de A, se toma el complemento a dos de B y se suma a A

Conversiones

Ejemplo: Convertir de decimal a complemento a dos

Vamos a convertir \pm 18 a complemento a dos, primero lo convertimos a binario

Número Cociente Resto
\frac{18}{2} 9 0
\frac{9}{2} 4 1
\frac{4}{2} 2 0
\frac{2}{2} 1 0

Entonces tenemos que la parte binaria es:

18_{(10} = 10010_{(2}

Para hallar el -18 hay que utilizar la negación del 18

Se ejecuta el complemento booleano de cada bit dentro de 1 palabra (recordemos que son 8 bits), entonces tenemos:

18_{(10} = 00010010_{(2}
00010010 \rightarrow 11101101

Se le suma 1 al patrón de bits resultante

11101101+1=11101110

Entonces tenemos que:

\begin{cases} 18_{(10} = 00010010_{(2} \\ -18_{(10} = 11101110_{(2} \end{cases}

Coma flotante

Coma flotante

La representación en coma flotante más importante es la definida en la norma 754 IEEE (ANSI/IEEE Std 754-1985)

Este estándar se desarrolló para facilitar la portabilidad de los programas de un procesador a otro y para alentar el desarrollo de programas numéricos sofisticados

Este estándar ha sido ampliamente adoptado y se utiliza prácticamente en todos los procesadores y coprocesadores aritméticos actuales

Hay dos representaciones en coma flotante:

  • Formato simple (32 bits)
  • Formato doble (64 bits)

Formato simple (32 bits)

En el formato simple se utiliza el siguiente formato para almacenar una palabra (32 bits):

Bit de signo Exponente Mantisa
1 bit 8 bits 23 bits

Dado un E_1=\text{ exponente } + 127 (127 es el máximo número positivo del exponente) tenemos que:

00000000_{(2}\leq E_1\leq 11111111_{(2}

Si denotamos (E1)_{(10} a la conversión decimal de E_1, tenemos que:

0\leq (E1)_{(10}\leq 2^7+2^6+2^5+2^4+2^3+2^2+2^1+2^0=255

O lo que seria lo mismo:

-127\leq (E_1)_{(10} -127\leq 128

Si denotamos \alpha=(E_1)_{(10} -127 tenemos que:

-127\leq\alpha\leq 128
(E_1)=\alpha+127

Denotamos s como el bit de signo y M como la mantisa. A raíz de esto, surgen dos tipos de números:

  • Números normales
    -127 < \alpha < 128

    Conversión a número normal: (-1)\cdot s \cdot 1,M \cdot 2^\alpha

  • Números subnormales
    \alpha = (-127)

    Conversión a número subnormal: (-1)\cdot s \cdot 0,M \cdot 2^{-126}

  • \alpha = 128

    Da lugar a excepciones del tipo +\infty, -\infty\text{ y NaN} (no es un número, Not a Number del inglés)

Se utiliza un bit escondido (hidden bit del inglés) en la mantisa. Se toma el primer dígito que siempre es a_1 = 1. Este bit escondido no hará falta almacenarlo, consiguiendo así unos cuantos números más

Número Decimal Binario
\tiny \text{Máximo número normal positivo} \tiny 3,40282347 \cdot 10^{38} \tiny\text{0 11111110 11111111111111111111111}
\tiny \text{Máximo número normal negativo} \tiny -3,40282347 \cdot 10^{38} \tiny \text{1 11111110 11111111111111111111111}
\tiny \text{Mínimo número normal positivo} \tiny 1,17549435 \cdot 10^{-38} \tiny \text{0 00000001 00000000000000000000000}
\tiny \text{Mínimo número normal negativo} \tiny -1,17549435 \cdot 10^{-38} \tiny \text{1 00000001 00000000000000000000000}
\tiny \text{Máximo número subnormal positivo} \tiny 1,17549421 \cdot 10[{-38} \tiny \text{0 00000000 11111111111111111111111}
\tiny \text{Máximo número subnormal negativo} \tiny -1,17549421 \cdot 10[{-38} \tiny \text{1 00000000 11111111111111111111111}
\tiny \text{Mínimo número subnormal positivo} \tiny 1,40129846 \cdot 10^{-45} \tiny \text{0 00000000 00000000000000000000001}
\tiny \text{Mínimo número subnormal negativo} \tiny -1,40129846 \cdot 10^{-45} \tiny \text{1 00000000 00000000000000000000001}
\tiny \text{+0} \tiny 0,0 \tiny \text{0 00000000 00000000000000000000000}
\tiny \text{-0} \tiny -0,0 \tiny \text{1 00000000 00000000000000000000000}
\tiny +\infty \tiny +\infty \tiny \text{0 11111111 00000000000000000000000}
\tiny -\infty \tiny -\infty \tiny \text{1 11111111 00000000000000000000000}
\tiny \text{NaN} \tiny NaN \tiny \text{(0 }\acute{o}\text{ 1) 11111111 (alg}\acute{u}\text{n 1)}

Conversiones

Ejemplo: convertir el 3737 a formato simple (32 bits)

Es positivo, por tanto el signo es 0

Número Cociente Resto
\frac{3737}{2} 1868 1
\frac{1868}{2} 934 0
\frac{934}{2} 467 0
\frac{467}{2} 233 1
\frac{233}{2} 116 1
\frac{116}{2} 58 0
\frac{58}{2} 29 0
\frac{29}{2} 14 1
\frac{14}{2} 7 0
\frac{7}{2} 3 1
\frac{3}{2} 1 1

Entonces tenemos que la parte binaria es:

3737_{(10} = 111010011001_{(2}

Para el exponente vamos a necesitar mover 12 cifras decimales, por tanto debemos hacer 127 + 11 = 138 (sumamos 11 porque el bit escondido no se cuenta)

Número Cociente Resto
\frac{138}{2} 69 0
\frac{69}{2} 34 1
\frac{34}{2} 17 0
\frac{17}{2} 8 1
\frac{8}{2} 4 0
\frac{4}{2} 2 0
\frac{2}{2} 1 0

Entonces tenemos que el exponente es:

138_{(10} = 10001010_{(2}

Entonces tenemos que:

3737_{(10} = \text{0 10001010 11010011001000000000000}_{(2}

Formato doble (64 bits)

En el formato simple se utiliza el siguiente formato para almacenar dos palabras (64 bits):

Bit de signo Exponente Mantisa
1 bit 11 bits 52 bits

Dado un E_1=\text{ exponente } + 1023 (1023 es el máximo número positivo del exponente) tenemos que:

00000000000_{(2}\leq E_1\leq 11111111111_{(2}

Si denotamos (E1)_{(10} a la conversión decimal de E_1, tenemos que:

0\leq (E1)_{(10}\leq 2^{10}+2^9+2^8+2^7+2^6+2^5+2^4+2^3+2^2+2^1+2^0=2047

O lo que seria lo mismo:

-1023\leq (E_1)_{(10} -1023\leq 1024

Si denotamos \alpha=(E_1)_{(10} -1023 tenemos que:

-1023\leq\alpha\leq 1024
(E_1)=\alpha+1023

Denotamos s como el bit de signo y M como la mantisa. A raíz de esto, surgen dos tipos de números:

  • Números normales
    -1023 < \alpha < 1024

    Conversión a número normal: (-1)\cdot s \cdot 1,M \cdot 2^\alpha

  • Números subnormales
    \alpha = (-1023)

    Conversión a número subnormal: (-1)\cdot s \cdot 0,M \cdot 2^{-1022}

  • \alpha = 1024

    Da lugar a excepciones del tipo +\infty, -\infty\text{ y NaN} (no es un número, Not a Number del inglés)

Se utiliza un bit escondido (hidden bit del inglés) en la mantisa. Se toma el primer dígito que siempre es a_1 = 1. Este bit escondido no hará falta almacenarlo, consiguiendo así unos cuantos números más

Número Decimal Binario
\tiny \text{Máximo número}\\ \text{normal positivo} \tiny 1,7976931 \cdot 10^{308} \tiny \text{0 11111111110 1111111111111111111111111111111111111111111111111111}
\tiny \text{Máximo número}\\ \text{normal negativo} \tiny -1,7976931 \cdot 10^{308} \tiny \text{1 11111111110 1111111111111111111111111111111111111111111111111111}
\tiny \text{Mínimo número}\\ \text{normal positivo} \tiny 2,2250738 \cdot 10^{-308} \tiny \text{0 00000000001 0000000000000000000000000000000000000000000000000000}
\tiny \text{Mínimo número}\\ \text{normal negativo} \tiny -2,2250738 \cdot 10^{-308} \tiny \text{1 00000000001 0000000000000000000000000000000000000000000000000000}
\tiny \text{Máximo número}\\ \text{subnormal positivo} \tiny 2,2250738 \cdot 10^{-308} \tiny \text{0 00000000000 1111111111111111111111111111111111111111111111111111}
\tiny \text{Máximo número}\\ \text{subnormal negativo} \tiny -2,2250738 \cdot 10^{-308} \tiny \text{1 00000000000 1111111111111111111111111111111111111111111111111111}
\tiny \text{Mínimo número}\\ \text{subnormal positivo} \tiny 4,9406564 \cdot 10^{-324} \tiny \text{0 00000000000 0000000000000000000000000000000000000000000000000001}
\tiny \text{Mínimo número}\\ \text{subnormal negativo} \tiny -4,9406564 \cdot 10^{-324} \tiny \text{1 00000000000 0000000000000000000000000000000000000000000000000001}
\tiny +0 \tiny 0,0 \tiny \text{0 00000000000 0000000000000000000000000000000000000000000000000000}
\tiny -0 \tiny -0,0 \tiny \text{1 00000000000 0000000000000000000000000000000000000000000000000000}
\tiny +\infty \tiny +\infty \tiny \text{0 11111111111 0000000000000000000000000000000000000000000000000000}
\tiny -\infty \tiny -\infty \tiny \text{1 11111111111 0000000000000000000000000000000000000000000000000000}
\tiny \text{NaN} \tiny \text{NaN} \tiny \text{(0 }\acute{o}\text{ 1) 11111111111 (alg}\acute{u}\text{n 1)}

Conversiones

Ejemplo: convertir el 3737 a formato doble (64 bits)

Es positivo, por tanto el signo es 0

Número Cociente Resto
\frac{3737}{2} 1868 1
\frac{1868}{2} 934 0
\frac{934}{2} 467 0
\frac{467}{2} 233 1
\frac{233}{2} 116 1
\frac{116}{2} 58 0
\frac{58}{2} 29 0
\frac{29}{2} 14 1
\frac{14}{2} 7 0
\frac{7}{2} 3 1
\frac{3}{2} 1 1

Entonces tenemos que la parte binaria es:

3737_{(10} = 111010011001_{(2}

Para el exponente vamos a necesitar mover 12 cifras decimales, por tanto debemos hacer 1023 + 11 = 1034 (sumamos 11 porque el bit escondido no se cuenta)

Número Cociente Resto
\frac{1034}{2} 517 0
\frac{517}{2} 258 1
\frac{258}{2} 129 0
\frac{129}{2} 64 1
\frac{64}{2} 32 0
\frac{32}{2} 16 0
\frac{16}{2} 8 0
\frac{8}{2} 4 0
\frac{4}{2} 2 0
\frac{2}{2} 1 0

Entonces tenemos que el exponente es:

138_{(10} = 10000001010_{(2}

Entonces tenemos que:

\tiny 3737_{(10} = \text{0 10000001010 1101001100100000000000000000000000000000000000000000}_{(2}

Álgebra de Boole

Álgebra de Boole

El álgebra de Boole es una disciplina que analiza los circuitos digitales y otros sistemas digitales

Recibe su nombre en honor al matemático inglés George Boole, que propuso los principios básicos de este álgebra en 1854 en su tratado An investigation of the laws of thought on wich to found the mathematical theories of logic and probabilities

En 1938, Claude Shannon, un investigador asistente en el Departamento de Ingeniería Eléctrica del M.I.T., sugirió que el álgebra de Boole podría usarse para resolver problemas de circuitos de conmutación

Las técnicas de Shannon se usaron, consecuentemente en el análisis y diseño de circuitos digitales. El álgebra de Boole resulta una herramienta útil en dos áreas:

  • Análisis
    Es una forma concisa de descubrir el funcionamiento de los circuitos digitales
  • Diseño
    Dada una función deseada, se puede aplicar el álgebra de Boole para desarrollar una implementación de complejidad simplificada de esa función

El álgebra de Boole usa variables y operaciones lógicas. Una variable puede tomar el valor 1 cuando es verdadero ó 0 cuando es falso. Tiene únicamente tres operaciones lógicas básicas (AND, OR y NOT), que se representan simbólicamente:

AND OR NOT
A AND B A OR B NOT A
A\wedge B A\vee B \neg A

Tablas de verdad

La tabla de verdad define las operaciones lógicas básicas, enumerando el valor para cada combinación posible de los valores de los operandos. Además de los operadores básicos del álgebra de Boole, también se suelen enumerar tres operadores útiles: XOR, XNOR, NAND y NOR. Los cuales se pueden obtener haciendo operaciones con los operadores básicos

Tabla AND

La operación AND es verdadera si y sólo si los dos operandos son verdaderos

A B A\wedge B
0 0 0
0 1 0
1 0 0
1 1 1

Tabla OR

La operación OR es verdadera si y sólo si los uno o ambos operandos son verdaderos

A B A\vee B
0 0 0
0 1 1
1 0 1
1 1 1

Tabla NOT

La operación NOT invierte el valor del operando

A \neg A
0 1
1 0

Tabla XOR

La operación XOR es verdadera si y sólo uno de los operandos es verdadero

Equivale a realizar:

(A \wedge \neg B) \vee (\neg A \wedge B) \equiv (A \vee B) \wedge (\neg A \vee \neg B)

A B A\oplus B
0 0 0
0 1 1
1 0 1
1 1 0

Tabla XNOR

La operación XNOR es la negación de la operación XOR

Equivale a realizar:

(A \wedge B) \vee (\neg A \wedge \neg B)

A B \neg(A\oplus B)
0 0 1
0 1 0
1 0 0
1 1 1

Tabla NAND

La operación NAND es la negación de la operación AND

Equivale a realizar:

\neg(A \wedge B)

A B \neg(A \wedge B)
0 0 1
0 1 1
1 0 1
1 1 0

Tabla NOR

La operación NOR es la negación de la operación OR

Equivale a realizar:

\neg(A \vee B)

A B \neg(A \vee B)
0 0 1
0 1 0
1 0 0
1 1 0

Identidades básicas

Hay dos clases de identidades:

  • Reglas básicas (postulados)
    Se afirman sin demostración
  • Otras identidades
    Se pueden derivar de los postulados básicos

Los postulados definen la manera en la que las expresiones booleanas se interpretan

Reglas básicas
A \wedge B = B \wedge A A \vee B = B \vee A Ley conmutativa
A \wedge (B \vee C) = (A \wedge B) \vee (A \wedge C) A \vee (B \wedge C) = (A \vee B) \wedge (A \vee C) Ley distributiva
1 \wedge A = A 0 \vee A = A Elemento neutro
A \wedge \neg A = 0 A \vee \neg A = 1 Elemento complementario
Otras identidades
0 \wedge A = 0 1 \vee A = 1
A \wedge A = A A \vee A = A
A \wedge (B \wedge C) = (A \wedge B) \wedge C A \vee (B \vee C) = (A \vee B) \vee C Ley asociativa
\neg (A \wedge B) = \neg A \vee \neg B \neg (A \vee B) = \neg A \wedge \neg B Teorema de Morgan