0% encontró este documento útil (0 votos)
2 vistas13 páginas

Tema1 Informatica

El documento aborda la representación y almacenamiento de información en computadoras, explicando cómo los datos abstractos se traducen a cadenas de bits. Se introducen conceptos clave como bits, bytes, notación hexadecimal y la organización de la memoria principal, incluyendo el tamaño de palabra y el endianness. Además, se discuten las implicaciones de la alineación de bytes y palabras en el acceso a la memoria y la ejecución de programas.

Cargado por

mrcsmesa1
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
2 vistas13 páginas

Tema1 Informatica

El documento aborda la representación y almacenamiento de información en computadoras, explicando cómo los datos abstractos se traducen a cadenas de bits. Se introducen conceptos clave como bits, bytes, notación hexadecimal y la organización de la memoria principal, incluyendo el tamaño de palabra y el endianness. Además, se discuten las implicaciones de la alineación de bytes y palabras en el acceso a la memoria y la ejecución de programas.

Cargado por

mrcsmesa1
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Tema 1

Representación y almacenamiento de la información. Introducción. Bits y bytes.


Organización de la memoria principal. Representación de la Información como cadenas
de bits. Inexistencia de “tipos” para los ficheros de disco.
1. Representación y almacenamiento de la información.

1.1 Introducción

Una computadora puede almacenar muchos tipos de información. Un lenguaje de alto nivel
(HLL) normalmente tendrá varios tipos de datos, por ejemplo, int, float y char en los lenguajes
C/C++. Sin embargo, una computadora no puede almacenar directamente estos tipos de datos,
solo almacena 0 y 1. Por tanto, ¿Cómo se representan estos datos abstractos de C/C++ u HLL
en términos de 0 y 1? ¿Qué aspecto tiene la variable de tipo char internamente? Relacionado
también esta como se usan los 0 y 1 para representar nuestro programa, es decir,
instrucciones en lenguaje maquina generadas una vez compilado nuestro programa en C/C++ u
High level language (HLL). En adelante analizamos como se representan varios tipos de
información en términos de 0 y 1, cómo y dónde se almacenan los elementos dentro de una
estructura de memoria principal en nuestra computadora.

1.2 Bits y Bytes

1.2.1 Dígitos Binarios

Los 0 y 1 que se utilizan para almacenar información en una computadora se denominan bits.
El término proviene de un dígito binario, es decir, un dígito en la forma de base 2 de un
número, la idea es que cada pieza de información ha de ser representada como una cadena de
bits.

Se etiquetan bits individuales dentro de una cadena de bits de derecha a izquierda,


comenzando por el 0. Por ejemplo, en la cadena de bits 1101, decimos Bit 0 = 1, Bit 1 = 0, Bit 2
= 1 y Bit 3 = 1.

Si usamos una cadena de n bits para representar un entero no negativo, el Bit n-1, es decir, el
bit más a la izquierda, es el bit más significativo (Most Significant Bit). En una cadena de n bits,
el bit 0, el bit más a la derecha, se denomina bit menos significativo (Least Significant Bit).

Un bit se fija si es 1 y se borra si es 0. Una cadena de ocho bits generalmente se llama byte. Las
cadenas de bits de ocho bits son importantes por dos razones:

Primero, al almacenar caracteres, normalmente almacenamos cada carácter como una cadena
de 8 bits. En segundo lugar, las celdas de almacenamiento de la computadora están
compuestas por un número entero de bytes, es decir, un múltiplo par de ocho bits, 16 bits y 32
los bits son los tamaños de celda más comunes.

En el mundo de la informática se extendió el juego de palabras, "byte" al término nibble, que


significa cadena de 4 bits. Entonces, cada dígito hexadecimal se llama nibble.

1.2.2 Notación hexagonal


Necesitaremos definir una notación abreviada ( "taquigráfica" ) que se utilizará para escribir
cadenas de bits largas. Para leer y escribir una cadena tan larga como esta
‘1001110010101110’ aceptamos usar la notación hexadecimal, que consiste en agrupar una
cadena de bits en subcadenas de 4 bits, y luego dando un nombre de un solo carácter a cada
subcadena. Para la cadena 1001110010101110, la agrupación sería 1001 1100 1010 1110

A continuación, le damos un nombre a cada subcadena de 4 bits. Para hacer esto, tratamos
cada subcadena de 4 bits como si fuera un numero en base-2. Por ejemplo, la subcadena de
arriba a la izquierda, 1001, es la representación en base 2 para el número 9, ya que:

1 *(23) + 0 * (22) + 0 * (21) + 1 * (20) = 9;

La segunda subcadena, 1100, es la forma base 2 para el número 12, por lo que lo llamaremos
"12." Sin embargo, queremos usar un nombre de un solo carácter, por lo que lo llamaremos
"C" porque llamaremos 10 "A", 11 "B", 12 "C", y así sucesivamente, hasta el 15, que
llamaremos "F".

En otras palabras, nos referiremos a la cadena 1001110010101110 como 0x9cae. Esto es


ciertamente mucho más práctico, aunque la computadora está almacenando a la cadena
original ‘1001110010101110’.

Decimos que 0x9cae es la forma hexadecimal o "hexadecimal" de la cadena de bits


1001110010101110. Usando la notación del lenguaje C, anteponiendo "0x" significa
hexadecimal, en este caso 0x9cae.

Usamos las cadenas de bits para representar diferentes tipos de información, como numéricos
y no numéricos. Si usamos una cadena de bits como un número no negativo, entonces su
forma hexadecimal representa en base 16 ese número.

Por ejemplo, la cadena anterior 1001110010101110, que representa un número en base 2 no


negativo, es igual a:

1* (215) + 0* (214) + 0 *(213) + 1* (212) + 1* (211) + 1* (210) + 0 *(29) + 0* (28) + 1 *(27) + 0* (26) + 1
*(25) + 0* (24) + 1* (23) + 1 *(22) + 1 *(21) + 0 *(20) = 40. 110 (En Decimal)

Si la forma hexadecimal de esta cadena de bits, 0x9cae, se trata como un número en base 16,
su valor es:

9 (163) + 12 (162) + 10 (161) + 14 (160) = 40. 110 (En Decimal);

Y por lo tanto la forma hexadecimal es la versión en base 16 del número. El origen del término
"Hexadecimal", significa "perteneciente a 16” (pero no esta relacionado con que nuestra
cadena de bits tenga 16 bits de longitud)

La conversión opuesta, en base 10 a binario, se puede acelerar de la misma manera, primero


convirtiendo de base-10 a base-16, y luego desagrupar el hexadecimal en forma binaria. La
conversión de decimal a base 16 se hace dividiendo repetidamente por 16 hasta obtener un
cociente menor que 16; los dígitos hexadecimales se obtienen como los residuos y el último
cociente. Para hacer esto concreto, convertimos el número decimal 21602 a binario:

Dividir 21602 entre 16, dando 1350, resto 2.

Dividir 1350 entre 16, dando 84, resto 6.

Dividir 84 entre 16, dando 5, resto 4.


La forma hexadecimal de 21602 es 5462.

Por tanto, la forma binaria es 0101 0100 0110 0010, es decir, 0101010001100010.

5 4 6 2

El ingrediente principal aquí es la división repetida por 16. Al dividir por 16 una y otra vez,
estamos construyendo potencias superiores a 16. Nótese que nuestra segunda división de 84
entre 16 es una división acumulativa por 162.

Nota: ¡No hay el almacenamiento “hexadecimal” a nivel de máquina!

Recuerde, hexadecimal es simplemente una notación para los humanos. Es incorrecto decir
algo como "la máquina almacena el número en hexadecimal”, “. El compilador convierte el
número en hexadecimal”, etc.

1.3 Organización de la memoria principal

Durante el tiempo que se ejecuta un programa, tanto los datos del programa como el
programa en sí, es decir, las instrucciones de la máquina, se almacenan en la memoria
principal.

1.3.1 bytes, palabras y direcciones

[Link] Conceptos básicos

La memoria ( RAM / ROM Random Access Memory / Read-Only Memory) puede verse como
una cadena larga de bytes consecutivos. Cada byte tiene un número de identificación, llamado
dirección (Address). Las direcciones de bytes son enteros consecutivos, de modo que la
memoria consta de Byte 0, Byte 1, Byte 2 y así sucesivamente.

En cada máquina, un cierto número de bytes consecutivos se denomina palabra. El número de


bytes o bits (hay ocho veces más bits que bytes, ya que un byte consta de ocho bits) en una
palabra en una máquina determinada se denomina tamaño de palabra de la máquina. Esto
generalmente se define en términos del tamaño del número que puede manejar el circuito de
adición de la CPU, que en los últimos años ha sido típicamente de 32 bits. En otras palabras, el
sumador de la CPU ingresa dos números de 32 bits y genera una suma de 32 bits, por lo que
decimos que el tamaño de la palabra es de 32 bits. Los primeros miembros de la familia CPU
de Intel tenían palabras de 16 bits, mientras que los últimos se extendieron a 32 bits y 64 bits
posteriormente. Para garantizar que los programas escritos para los primeros chips se ejecuten
en los últimos, Intel diseñó CPUs para que pudieran ejecutarse en varios modos, uno para cada
tamaño de bit.

La mayoría de las máquinas no permiten la superposición de palabras. Eso significa, por


ejemplo, que en una máquina de 32 bits, los bytes 0-3 formarán una palabra y los bytes 4-7
formarán una palabra, pero los bytes 1-4 NO forman una palabra. Si su programa intenta
acceder a la "palabra" que consta de Bytes 1-4, puede causar un error de ejecución. En algunos
sistemas Unix, por ejemplo, puede recibir el mensaje de error "error de bus". Sin embargo, una
excepción a esto son los chips Intel, que no requieren alineación en los límites de palabras
como este. Sin embargo, tenga en cuenta que, si su programa usa palabras no alineadas, cada
vez que acceda a dicha palabra, la CPU debe obtener dos palabras de la memoria, lo que
ralentiza las cosas.
Así como una cadena de bits tiene sus bits más significativos y menos significativos, una
palabra tendrá sus bits más significativos y bytes menos significativos.

Para ilustrar esto, suponga que el tamaño de la palabra es de 32 bits y considere el


almacenamiento del entero 25, cual es 0000 0000 0000 0000 0000 0000 0001 1001 en forma
de bits y 0x00000019 como hexadecimal. Tres bytes contendrán cada uno 0x00 y el cuarto
0x19, con el 0x19 byte es el menos significativo y el primer byte 0x00 es el más significativo.

No solo cada byte tiene una dirección, sino que también cada palabra tiene una. En un sistema
Linux de 32 bits, Por ejemplo, la dirección de una palabra será la dirección de su byte de
dirección más baja. Entonces, por ejemplo, Bytes 4-7 comprenden la Palabra 4. En septiembre
de 2012, la mayoría de los ordenadores de escritorio y portátiles tienen un tamaño de palabra
de 64 bits, mientras que la mayoría de las CPU de los teléfonos celulares tienen palabras de 32
bits.

[Link] Direcciones de Palabra

[Link] Extremidad- Endianness

En computación, endianness es el orden o secuencia de bytes de una palabra de datos digitales


en la memoria de la computadora. El endianismo se expresa principalmente como big-endian
(BE) o little-endian (LE).

Un sistema big-endian almacena el byte más significativo de una palabra en la dirección de


memoria más pequeña y el byte menos significativo en la más grande.

Un sistema little-endian, por el contrario, almacena el byte menos significativo en la dirección


más pequeña. Endianness también se puede utilizar para describir el orden en el que se
transmiten los bits a través de un canal de comunicación, por ejemplo, big-endian en un canal
de comunicaciones transmite primero los bits más significativos.

Estos dos diagramas muestran cómo dos computadoras que usan diferentes endianness
almacenan un entero de 32 bits (cuatro bytes) con el valor de 0x0A0B0C0D. En ambos casos, el
número entero se divide en cuatro bytes, 0x0A, 0x0B, 0x0C y 0x0D, y los bytes se almacenan
en cuatro bytes secuenciales en la memoria, comenzando con la ubicación de la memoria con
la dirección de a, luego a + 1, a + 2 y a + 3. La diferencia entre endian grande y pequeño es el
orden de los cuatro bytes del entero que se almacena.
El diagrama del lado izquierdo muestra una computadora usando big-endian. Esto inicia el
almacenamiento del entero con el byte más significativo, 0x0A, en la dirección a, y termina con
el byte menos significativo, 0x0D, en la dirección a + 3.

El diagrama del lado derecho muestra una computadora usando little-endian. Esto inicia el
almacenamiento del entero con el byte menos significativo, 0x0D, en la dirección a, y termina
con el byte más significativo, 0x0A, en la dirección a + 3.

Dado que cada computadora usará su mismo endianness tanto para almacenar como para
recuperar el entero, los resultados serán los mismos para ambas computadoras. Los problemas
pueden surgir solo cuando la memoria se aborda por bytes en lugar de números enteros, o
cuando el contenido de la memoria se transmite entre computadoras con diferente
endianidad.

Los chips SPARC, por otro lado, asignan el byte menos significativo a la dirección más alta, un
big-endian esquema. Este también es el caso de los mainframes de IBM, así como de la
máquina virtual Java.

Algunos chips, como MIPS y PowerPC, incluso le dan al sistema operativo una opción en
cuanto a qué reglas de la CPU seguir; cuando se inicia el sistema operativo, establece qué
"endian-ness" se utilizará.

Los chips SPARC posteriores hacen esto, así como los chips ARM utilizados en muchos
teléfonos.

El problema de la endianidad también surge en Internet. Si alguien está ejecutando un


navegador web en un little-endian máquina, pero el servidor del sitio web es big-endian, no
podrán comunicarse. Así, como estándar, el Internet usa el orden big-endian.

Otros aspectos

(a) Suponga que estamos usando una palabra de n bits para almacenar un entero no
negativo. Luego, el rango de números que podemos almacenar será de 0 a 2 n - 1, que
para n = 16 será de 0 a 65,535, y para n = 32 será de 0 a [Link].
(b) Si estamos almacenando un entero con signo en una palabra de n bits, entonces la
muestra su rango será -2n-1 a 2n-1 - 1, que será de -32,768 a +32,767 para palabras de 16
bits, y -2,147,483,648 a +2,147,483,647 para palabras de 32 bits.
(c) Suponga que deseamos almacenar caracteres. Recuerde que un carácter ASCII ocupará
siete bits, no ocho. Pero es típico que el siete se "redondee" a ocho, dejando 1 bit sin
usar (o usado para algún otro propósito, como una técnica llamada paridad, que se
utiliza para ayudar a detectar errores). En ese caso, las máquinas con palabras de 16
bits pueden almacenar dos caracteres por palabra, mientras que las máquinas de 32
bits pueden almacenar cuatro caracteres por palabra.
(d) Suponga que estamos almacenando instrucciones de máquina. Algunas máquinas
utilizan una longitud de instrucción fija, igual a el tamaño de la palabra. Estas son las
llamadas máquinas RISC. Por otro lado, la mayoría de las máquinas antiguas tienen
las instrucciones son de longitud variable. En máquinas Intel anteriores, por ejemplo,
las instrucciones tenían una longitud de uno a seis bytes (y el rango tiene
crecido mucho más desde entonces). Dado que el tamaño de la palabra en esas
máquinas era de 16 bits, es decir, dos bytes, ver que la palabra de memoria puede
contener dos instrucciones en algunos casos, mientras que en otros la instrucción se
distribuiría en varias palabras.

1.4 Representación de la información como cadenas de bits

1.4.1 Representación de números enteros

Representar valores enteros no negativos es sencillo: solo usamos la representación en base 2,


como 0010 para el digito decimal 2. Para representar diez números (0..9) necesito 4 bit; con
tres solo llegaría a representar 8 números (23=8), con 4 bit puedo representar hasta 16
números (24=16), por ejemplo, el numero decimal 1549 a código binario seria:

1 5 4 9 (10

0001 0101 0100 1001 (2

Y en el caso contrario un numero entero en binario a decimal:

0111 1000 0101 0000 (2

7 8 5 0 (10

Debido a su sencillez este código se puede manejar por circuitos muy fáciles de diseñar. Sin
embargo, a menudo es necesario operar con valores positivos y negativos, es decir números
con signo.

En un numero binario con signo el bit más significativo (en un byte, el bit 7) especifica el signo
del número. El resto de bit se utilizan para representar el número (en un byte, del bit 0 al 6). Si
el número se almacenase en dos bytes en vez de uno, el bit de signo seguiría siendo el bit más
significativo, en este caso el bit 15.

El bit del signo es 0 si el numero es positivo o si es cero y 1 si es negativo. Según esta regla el
numero 0 será 00000000 aunque también podría ser 10000000.

Cuando un byte contiene un numero con signo, un solo byte pude representar valores
positivos comprendidos entre 0 (0000 0000 binario) y el +127 (0111 1111 binario).

Según lo visto hasta ahora el numero -1 (1 con el bit de signo en negativo) se debería
representar como 1000 0001. En realidad existen varios tipos de representaciones para
numeros con signo y los más comunes son:

Signo y magnitud: es el método natural visto hasta el momento. A la forma natural del número
se le añade el bit de signo:

0 para números positivos

1 para números negativos

Existe la posibilidad de tener +0 y -0. Esto es redundante ya que utilizamos dos elementos para
representar un mismo número.
Complemento a 1: Los números positivos se representan igual que el signo y magnitud. En los
números negativos se cambian los 1 por 0 y los 0 por 1, con lo que existen dos posibles
representaciones para el 0.

Complemento a 2: los números positivos se representan igual que con los dos tipos anteriores.
Los negativos son el resultado de sumar 1 al número equivalentemente en complemento a 1.
De esta forma el 0 solo se podrá representar de una forma y no se desperdiciará ningún
elemento.

Como ejemplo, se observan están representaciones con 4 bit, 1 para el signo y los otros 3 para
el dato:

Nº Decimal Signo y magnitud Complemento a 1 Complemento a 2


7 0 111 0 111 0 111
+1 0 001 0 001 0 001
+0 0 000 0 000 0 000
-0 1 000 1 111 -
-1 1 001 1 110 1 001
-7 1 111 1 000 1 001
-8 - - 1 000

¿De todos estos sistemas cual es el mas adecuado?, lo que necesitamos es un método para
representar el -1, de forma que cuando sume con +1 el resultado sea 0. Por eso el -1 debe
representarse como 1 1111111 que es la representación en complemento a 2: este valor
binario produce la respuesta correcta:

0 0000001 (+1 en decimal)

+ 1 1111111 (-1 en decimal)

10 0000000 (0 en decimal)

Este bit adicional al principio del resultado es el acarreo, el bit que sobra al efectuar la suma, y
en este caso se ignora.

Complemento a 2

Al igual que el -1, todos los números negativos con signo se representan en complemento a 2
para que las sumas produzcan las respuestas correctas. Como la mayoría de ordenadores solo
saben ‘sumar’ , para estar tienen que utilizar sumas de numeros negativos, de ahí la utilidad
del complemento a 2. Para averiguar el complemento a 2 de un numero binario positivo (su
representación negativa) simplemente se siguen dos pasos:

1) Se toma la forma positiva del numero y se invierte cada bit, es decir, se cambian los 1
por 0 y los 0 por 1.
2) Después se suma 1 al resultado

Ejemplo: representación binaria en complemento a 2 de -34:

0 100010 (+34 en decimal)

1 011101 (Invertir los bit)

+ 1 (sumarle 1)
1 011110 (-34 en ca2)

También podemos encontrar la forma positiva de un numero negativo en ca2.

Ejemplo: averiguar que valor tiene 1011:

1011 (¿? Ca2)

0100 ( Invertir los bit)

+ 1 ( Sumarle 1):

0101 ( 5 en decimal) Luego el 1011 es la representación en ca2 del -5 en decimal

1.4.2 Representar datos de números reales (Notacion exponencial)

La idea principal aquí es usar la notación científica, de punto y de coma flotante. Se utiliza para
representar de una forma estándar los números fraccionarios (números reales), y los números
muy grandes. Puede representarse como: 3.2 × 10−4 para el número 0.00032. En este ejemplo,
3.2 se llama Mantisa, 10 es la Base y -4 se llama Exponente.

N=MxBE

Digamos, por ejemplo, que debemos almacenar números reales como cadenas de 16 bits,
podríamos dedicar 10 bits, Bits 15-6 a la mantisa M, y 6 bits, Bits 5-0, al exponente E.
Entonces, el número 1,25 podría representarse como 5 × 2 −2, es decir, con M = 5 y E = -2.

Como número de complemento a 2 de 10 bits, 5 está representado por la cadena de bits


0000000101, mientras que como número de complemento a 2 de 6 bits, -2 está representado
por 111110:

000010 (numero 2

111101 (invertir 0 y 1

+ 1 (Suma de 1

111110 ( -2

Por lo tanto, almacenaríamos el número 1,25 como cadena de 16 bits 0000000101 111110 es
decir, 0000000101111110 = 0x017e

Tenga en cuenta la compensación de diseño aquí: cuantos más bits dedico al exponente, más
amplio es el rango de números que puedo almacenar. Pero cuantos más bits le dedico a la
mantisa, menos error de redondeo tendré durante los cálculos.

[Link] IEEE Estándar (IEEE 754)

Trata la representación binaria de los números fraccionarios o reales. Reglas:

1) Como es una representación binaria la base es 2, B=2. Como siempre es la misma no se


almacenará. Tan solo se almacenará la representación del signo (1 bit), el exponente
(ne bit) y la mantisa (nm bit), todas ellas tendrán un tamaño y una posición. Si para
representar a un numero disponemos de n bit, resulta: n=signo + ne + nm
2) El bit de signo será 0 para los números positivos y 1 para los negativos.
3) El exponente podrá ser positivo o negativo pero no llevara bit de signo, se almacenara
como un ‘entero sesgado’, es decir, se obtiene sumándole un sesgo (valor constante
S). Este sesgo se calcula a partir del numero de bit utilizados en la parte del exponente
aplicando la formula S= 2ne-1 -1 . Si tuviéramos 8 bits para almacenar el exponente,
nuestro sesgo seria: S= 28-1-1=27-1=128-1=127.
Para calcular el exponente sesgado, e , usaremos la siguiente formula:
e= S+E= 2ne-1-1 +E
Por ejemplo, si tuviéramos 8 bit para representar el exponente de forma sesgada
sabiendo que el sesgo es 127 (0111 1111)

Exponente Exponente sesgado (e) en Exponente sesgado (e) en


decimal binario (dato real)
-2 127+(-2)=125 0111 1101
0 127+0 = 127 0111 1111
+2 127+(2)=129 1000 0001

4) El conjunto de bits que forman la mantisa se representan en binario natural (no en


ca2) y su formato es: 1,<parte_decimal>. El bit mas significativo (el de mas a la
izquierda), que siempre será un 1, ocupará la posición 0 (posición de las unidades en el
sistema decimal) y por tanto solo habrá un bit para representar la parte entera y
siempre será un 1: si el numero se representa de esta forma ser dice que esta
normalizado, de lo contrario estará desnormalizado.
En un sistema de mantisa y exponente con una misma base, si se cambia la mantisa se
tendrá que cambiar el exponente, basta con mover el punto decimal de la mantisa a
derecha o izquierda sin mas que restar o sumar uno al exponente.
También hay que tener en cuanta que la mantisa siempre empieza por “1.” , y
podemos considerar este dato como información oculta o implícita que no necesita
almacenarse porque es fija y así se ahorrara espacio. Esta transformación supone que
el número se guarda empaquetado y que cuando se quiera utilizar habrá que
desempaquetarlo, en decir ponerle un “1.” que le falta. La mantisa empaquetada, m
seria M= 1.m

5) Situaciones Especiales:
a. Cuando el exponente es cero, e=0, el “1.” De la mantisa no se encuentra
implícito, y en ese caso la mantisa, m se almacena desnormalizada, M = 0.m
b. El numero 0 se representa poniendo todos los bits del exponente y la mantisa
a 0.
c. Para indicar resultados especiales o números especiales (∞ o una
indeterminación 0.∞) se ponen todos los bits del exponente a 1.
6) Tipos de precisión. En función del numero totales de bit que utilicemos para
representar un número y el reparto que hagamos para la mantisa y el exponente (el
signo siempre será un bit), tendremos diferentes presiones. El estándar IEEE 754
considera los tamaños: simple precisión o doble precisión
1 bit 8 bit 23 bit
Signo (s) Exponente Sesgado (e) Mantisa empaquetada
(m)
Número real con signo según normalización IEEE 754
SIMPLE PRECISION. Tamaño 32 bit = 4 byte

1 bit 11 bit 52 bit


Signo (s) Exponente Sesgado (e) Mantisa empaquetada
(m)
Número real con signo según normalización IEEE 754
SIMPLE PRECISION. Tamaño 64 bit = 8 byte

1.4.3 Representación de datos de caracteres

Esto es simplemente una cuestión de elegir qué patrones de bits representarán qué
caracteres. Los dos sistemas más famosos son el Código estándar americano para el
intercambio de información (ASCII) y el Código de información decimal codificado en binario
(EBCDIC). ASCII almacena cada carácter como la forma base 2 de un número entre 0 y 127. Por
ejemplo, "A" se almacena como 6510 (01000001 = 0x41), "%" como 3710 (00100101 = 0x25), y
así sucesivamente.

Se puede obtener una lista completa de códigos ASCII estándar escribiendo man ascii en la
mayoría de los sistemas Linux. Tenga en cuenta que incluso las teclas como Retorno de carro,
Salto de línea, etc., se consideran caracteres y tienen códigos ASCII:

ASCII(7) Linux Programmer’s Manual ASCII(7)

NAME

ascii - the ASCII character set encoded in octal, decimal, and hexadecimal

DESCRIPTION

ASCII is the American Standard Code for Information Interchange. It is a 7-bit code. Many 8-bit
codes (such as ISO 8859-1, the Linux default character set) contain ASCII as their lower half. The
international counterpart of ASCII is known as ISO 646.

The following table contains the 128 ASCII characters.

C program '\X' escapes are noted.

Oct Dec Hex Char Oct Dec Hex Char

------------------------------------------------------------------------------------

000 0 00 NUL '\0' 100 64 40 @

001 1 01 SOH (start of heading) 101 65 41 A

002 2 02 STX (start of text) 102 66 42 B

003 3 03 ETX (end of text) 103 67 43 C

004 4 04 EOT (end of transmission) 104 68 44 D

005 5 05 ENQ (enquiry) 105 69 45 E


Dado que los códigos ASCII se toman de números en el rango de 0 a 27 - 1 = 127, cada código
consta de siete bits. El sistema EBCDIC consta de ocho bits y, por lo tanto, puede codificar 256
caracteres diferentes, a diferencia de los 128 de ASCII. En cualquier sistema, un carácter puede
almacenarse en un byte. En la actualidad, la gran mayoría de las máquinas utilizan el sistema
ASCII.

Para los documentos suelen contener tanto texto en chino como en inglés, es necesario que
exista una forma de distinguirlos. Big5 y Guobiao, dos de los sistemas de codificación más
utilizados para el chino, funcionan de la siguiente manera. El primero de los dos bytes de un
carácter chino tendrá su conjunto de bits más significativo en 1. Esto lo distingue de los
caracteres ASCII (inglés), cuyos bits más significativos son 0, lo que permite que el software
maneje documentos con mezcla de inglés y chino.

1.4.4 Representación de las instrucciones de la máquina

Cada tipo de computadora tiene un conjunto de códigos binarios que se utilizan para
especificar varias operaciones realizadas por la Unidad Central de Procesamiento (CPU) de la
computadora. Por ejemplo, en la familia de chips de CPU Intel, el código 0xc7070100, es decir,

11000111000001110000000100000000, significa poner el valor 1 en una determinada celda


de la memoria de la computadora. Los circuitos de la computadora están diseñados para
reconocer tales patrones y actuar en consecuencia. Una instrucción puede registrarse en la
computadora de dos maneras:

(a) Escribimos un programa en lenguaje máquina (o lenguaje ensamblador) produciendo


directamente instrucciones como la de arriba.

(b) Escribimos un programa en un lenguaje de alto nivel (HLL) como C, y el compilador traduce
ese programa en instrucciones como la anterior.

1.4.5 ¿Qué tipo de información se almacena aquí?

Por ejemplo, supongamos que tenemos la cadena de 16 bits 0111010000101011, es decir, en


forma hexadecimal 0x742b, en una máquina que utiliza un chip de CPU Intel en modo de 16
bits. Luego:

(a) si el programador está utilizando esta cadena para almacenar un entero con signo,
entonces su valor será 29,739;

(b) si esta cadena está siendo utilizada por el programador para almacenar caracteres,
entonces su contenido serán los caracteres "t" y "+";

(c) si el programador está utilizando esta cadena para almacenar una instrucción de máquina,
entonces la instrucción dice "saltar" (como un goto en C) hacia adelante 43 bytes.

Para la computadora, esto es solo una cadena de 16bits de 0 y 1, sin un significado especial. Y
la responsabilidad recae en la persona que escribe el programa; él o ella debe recordar qué
tipo de información almacenó en esa cadena de bits. Si el programador comete un error, la
computadora no se dará cuenta y seguirá las instrucciones del programador en el caso de que
programamos en lenguaje máquina directamente.

Si programamos en un lenguaje de alto nivel (HLL), digamos C, el compilador está produciendo


este lenguaje de máquina a partir de nuestra fuente HLL, y durante el tiempo que el
compilador está traduciendo el código fuente HLL al lenguaje de máquina, el compilador debe
“recordar” el tipo de cada variable y reaccionar en consecuencia. Y ahora, la responsabilidad
de manejar correctamente varios tipos de datos ahora está en manos del compilador, en lugar
de directamente en manos del programador, pero aún no en manos del hardware, que ignora
el tipo.

1.5 Inexistencia de "tipo" para los ficheros en disco

Encontrará el archivo de texto de términos y el archivo binario con bastante frecuencia en el


mundo de la informática, por lo que es importante comprenderlos bien, especialmente si son
bastante engañosos.

1.5.1 Geometría del disco

Los archivos se almacenan en discos. Un disco es un plato redondo giratorio con puntos
magnetizados en su superficie. Cada punto magnetizado registra un bit del archivo.

Los puntos magnetizados están ubicados en anillos concéntricos llamados pistas. Cada pista se
divide en sectores, que constan de, digamos, 512 bytes (4096 bits) cada uno.

Cuando se necesita acceder a parte del disco, primero se debe mover el cabezal de lectura /
escritura de su pista actual a la pista de interés; este movimiento se llama buscar. Luego el
cabezal debe esperar hasta que el sector de interés gire alrededor del cabezal, para que se
pueda realizar la lectura o escritura del sector.

Cuando se crea un archivo, el sistema operativo busca los sectores no utilizados en el disco en
los que colocar los bytes del archivo. Luego, el sistema operativo registra las ubicaciones
(número de pista, número de sector dentro de la pista) de los sectores del archivo, para que
los usuarios puedan acceder al archivo más adelante. Cada vez que un usuario desea acceder
al archivo, el sistema operativo buscará en sus registros para determinar dónde está el archivo
en el disco. Una vez más, el problema básico será que el hardware no conoce los tipos de
datos. Los bits en un archivo son solo eso, bits, y el hardware no sabe si el creador del archivo
pretendía que esos bits representaran números o caracteres o instrucciones de la máquina o lo
que sea.

1.5.2 Archivo de texto y archivo binario definiciones

Cualquier archivo es "binario", ya sea que conste de "texto" o no, en el sentido de que consta
de bits sin importar qué. Si nuestro archivo es de texto, esos bytes serán interpretados como
caracteres. Toda la información que se puede guardar en un archivo de texto son caracteres.
Esa información podrá por tanto ser visualizada por un editor de texto. Si se desean almacenar
los datos de una forma más eficiente, se puede trabajar con archivos binarios. Los números,
por ejemplo, no se almacenan como cadenas de caracteres, sino según la codificación interna
que use el ordenador. Esos archivos binarios no pueden visualizarse mediante un editor de
texto. Si lo que se desea es que nuestro archivo almacene una información generada por
nuestro programa y que luego esa información pueda ser, por ejemplo, editada, entonces se
deberá trabajar con ficheros de caracteres o de texto. Si lo que se desea es almacenar una
información que pueda luego ser procesada por el mismo u otro programa, entonces es mejor
trabajar con ficheros binarios

Resumiendo, un archivo o fichero es una cadena de bytes consecutivos terminada por un


carácter especial llamado EOF (“End Of File”);
Como ejemplo usamos un editor de texto, VIM de vi, que crea un archivo llamado FoxStory,
cuyo contenido es:
The quick brown fox

jumped over the fence

Luego, vim escribirá los códigos ASCII para los caracteres "T", "h", "e" y así sucesivamente en el
disco. Esto es un archivo de texto. El primer byte del archivo, por ejemplo, sea 01010100, el
código ASCII para "T", y tenemos la intención de que los humanos consideren 01010100 como
"T". Por otro lado, un archivo de imagen JPEG, [Link], que muestra al zorro
saltando por encima de la cerca. Los bytes en este archivo representarán píxeles en la imagen,
bajo el formato especial usado por JPEG. Es muy probable que algunos de esos bytes también
sean 01010100, solo por accidente; ciertamente, no están pensados como la letra "T". Y
muchos bytes estarán en el rango 10000000-11111111, es decir, 128-255, fuera del rango
ASCII. Entonces, este es un archivo binario. Otros ejemplos de archivos binarios:

• archivos de sonido

• archivos de lenguaje de máquina

• archivos comprimidos

1.5.3 Programas que acceden a archivos de texto

Al mostrar el archivo FoxStory usando “cat FoxStory” se nos mostrará lo siguiente:


The quick brown fox

jumped over the fence

La razón por la que esto ocurrió es que el programa cat interpretó el contenido del archivo
FoxStory como códigos ASCII. El código ASCII para "T" es 0x54 = 01010100. El programa cat
contiene llamadas a printf () que usan el formato% c. Este formato envía el byte, en este caso a
la pantalla. Este último busca la fuente correspondiente al número 0x54, que es la fuente para
'T', y es por eso que ves la 'T' en la pantalla. Tenga en cuenta también que, en el ejemplo
anterior, cat imprimió una nueva línea cuando encontró el carácter de nueva línea, ASCII 12,
00001100. Por el contrario, considere lo que sucedería si escribiera cat [Link] El
programa cat NO sabrá que [Link] no es un archivo de texto; por el contrario, cat
asume que cualquier archivo que se le proporcione será un archivo de texto.

1.5.4 Programas que acceden a archivos "binarios".

Estos programas son bastante diferentes para cada aplicación, por supuesto, ya que la
interpretación de los patrones de bits será diferente para un archivo de imagen que para un
archivo en lenguaje de máquina. Sin embargo, un punto es que cuando maneja tales archivos
en, digamos, C / C ++, es posible que deba advertir al sistema que accederá a archivos binarios.
La función fopen () de la biblioteca C, por ejemplo, para leer un archivo binario es posible que
deba especificar el modo "rb" (Abre un archivo binario para lectura. El archivo debe existir). La
función fopen () devuelve un puntero a una estructura que recoge las características del
archivo abierto. Si se produce algún error en la apertura del archivo, entonces la función fopen
() devuelve un puntero nulo.

También podría gustarte