IIC2343 / Syllabus-2023-2

Repositorio del semestre 2023-2 del curso Arquitectura de Computadores del DCC-UC.
37 stars 1 forks source link

Duda I1 2021-2 #51

Open denisseleiva opened 1 year ago

denisseleiva commented 1 year ago

Hola! No entiendo cómo hacer este ejercicio y no tiene pauta :( alguien me puede ayudar porfis

Captura de Pantalla 2023-10-11 a la(s) 15 59 55

Captura de Pantalla 2023-10-11 a la(s) 16 00 01

Geeermy commented 1 year ago

¡Hola Denisse!

Procedo a explicar el procedimiento por pregunta:

(a) En primer lugar, hay que tener cuidado: se indica que los enteros se interpretan con signo, es decir, debemos revisar el bit más significativo de los valores pedidos para ver si el número es positivo o negativo. Si el número es positivo, podemos calcular su valor decimal directamente con la fórmula de transformación de bases; si no es el caso, entonces primero debemos obtener su complemento de 2 para poder computar su valor absoluto correcto. Ahora, los valores nos los muestran en base hexadecimal. ¿Qué hacemos entonces? Los transformamos a base binaria directamente con el algoritmo que vimos en clases:

(b) Aquí hay tres cosas importantes: (1) El almacenamiento de un arreglo en memoria; (2) el endianness con el que almacenas los números de cada arreglo; y (3) la expresión en octal del valor. Iré por partes:

(1) Primero, al ser un arreglo, las direcciones de los números serán contiguas. Ahora, la memoria almacena palabra de 8 bits y los números del arreglo son de 16 bits, por lo que cada número ocupa 2 direcciones de memoria. Entonces, si el arreglo parte de la dirección 1, tenemos entonces que las direcciones 1 y 2 almacenan al primer número; las direcciones 3 y 4 almacenan al segundo número; y las direcciones 5 y 6 almacenan al tercer número.

(2) Luego, hay que ver cómo se almacena cada número. En este caso, nos informan que el endianness es little endian. Esto significa que la porción menos significativa de cada número se almacena en la dirección menor. Entonces, tenemos el siguiente esquema (considera "&" como la concatenación).

(3) Por último, nos falta representar el número en base octal. Un primer acercamiento sería transformar el número a base decimal y luego conseguir su equivalente en octal con el método de las divisiones... pero esto claramente toma harto tiempo. Un método más rápido es usar el algoritmo de transformación hexadecimal-binario visto en clases, pero con un twist. El algoritmo lo podemos usar entre hexadecimal y binario porque ambos son números cuya base es de la misma potencia (2 en este caso)... pero también podemos hacer lo mismo entre las bases octal y binaria porque también sus bases son de la misma potencia. Entonces, podemos hacer lo siguiente:

  1. Transformar el número de base hexadecimal a binaria con el algoritmo: 0xB8C5 => 1011100011000101

  2. Transformar el número de base binaria a octal con el algoritmo visto en clases. En este caso, en vez de agrupar de a 4 bits, lo haremos de a 3 (ya que con 3 bits podemos representar todos los símbolos de la base octal): 1011100011000101 => (001)(011)(100)(011)(000)(101) => $134305_8$

Notar que en el paréntesis de más a la izquierda agregué 2 0's porque me hacían falta para la transformación, podemos hacerlo porque esto no modifica el valor del número.

Con eso resolvimos todos los problemas. :) Avísame si queda claro o si te quedan dudas.

¡Un abrazo!

denisseleiva commented 1 year ago

Me quedo clariiiiisimo, muchas gracias :)

PD: por favor si pueden sería muy útil añadir las soluciones de las pautas 🙄

Geeermy commented 1 year ago

@denisseleiva yo no fui parte del curso en ese semestre y está subido todo el material que pudimos rescatar que tenía pauta :(

Geeermy commented 1 year ago

PD: Había tenido un pequeño error de cálculo para obtener el valor de la dirección 2 (me comí un 0 al transformar el número a decimal, era -72 y -68). El procedimiento es el mismo, por si acaso. :)

¡Saludos!