[2015][Julio][Problema 2]

[2015][Julio][Problema 2]

de Agustina Sierra Lima -
Número de respuestas: 6

Buenas , tengo una consulta sobre la parte a.

La letra dice que la función debe retornar la parte entera del valor medio de dos números enteros representados en binario de 8 bits. 

Si i y j son los dos números respectivamente el valor medio es (i+j/2) pero de este numero deberíamos quedarnos con la parte entera representada en 8 bits y la solución hace lo siguiente:

unsigned char memROM[65536];

unsigned short res;

res = (i+j)/2;

ROM[posMem] = res;

No entiendo por qué la variable res es de 16 bits donde en la rom deben guardarse palabras de 8 bits y tampoco me queda claro como es que efectivamente se guarda la parte entera.

Gracias.

Saludos.





En respuesta a Agustina Sierra Lima

Re: problema 2 examen julio 2015

de Federico Rivero -

Estimada,

Cómo estás?

Lo primero es notar que como ij y res son ints, entonces la división entre 2 involucrada es la división entera y por tanto el resultado ya es la parte entera. 

Luego, que res sea short no cambia, ya que en la asignación ROM[posMem] = res;  lo que hace C es asignar los 8 bits menos significativos de res a la ROM. De todos modos, como i y j son de 8 bits, el promedio también entra en 8 bits, lo cual causa que los 8 bits más significativos descartados sean 0s siempre. De cualquier modo, res podría estar definido como char y no habría problema

Saludos,

           Federico  

En respuesta a Federico Rivero

Re: problema 2 examen julio 2015

de Santiago Gongora De La Fuente -
Hola Federico,

una duda anexa a lo que preguntaba Agustina sobre el largo de la representación. Si queremos guardar algo con cantidad de bits no-múltiplo de 4 ¿es correcto expresarlo en hexadecimal aunque se "pase" de cantidad de bits?

Por ejemplo, 18:
  • en binario puro de 6 bits, sería 010010.
  • en hexadecimal, 0x12
Sin embargo, en el hexadecimal tengo (implícitamente) 8 bits.  Al momento de guardarlo como número de 6 bits ¿C también tomaría los 6 bits más significativos como en el caso anterior?

Gracias de antemano,
Saludos.
En respuesta a Santiago Gongora De La Fuente

Re: problema 2 examen julio 2015

de Federico Rivero -
Santiago, cómo estás? Los ceros a la izquierda no molestan. Vos podés escribir char c = 0x000041 y al char c se le va a asignar 0x41. El caso que mencionás de los 6 bits es algo fantasioso porque no hay tipos de datos de 6 bits, pero asumiendo que los hubiera, sí, imagino que eso es lo que pasaría.

Saludos,
Federico
En respuesta a Federico Rivero

Re: problema 2 examen julio 2015

de Agustina Sierra Lima -

Federico gracias por la respuesta,

Si definía res como unsigned char también pasaría que al hacer i+j/2 ya me quedaría con la parte entera? no tenia idea de estas cosas de C.

Cuando tengo que compilar esto en assembler también ocurre? yo lo que hice fue definir AL como i y Ah como j , luego en un registro auxiliar CX los sume y luego les hice un SHR CX,1.

Saludos.


En respuesta a Agustina Sierra Lima

Re: problema 2 examen julio 2015

de Federico Rivero -
En assembler tenés que tener cuidado, ya que si sumás AL y AH, perdés el bit más significativo. Lo correcto sería guardar ambos operandos en registros de 16 bits, realizar la cuenta ahí, y luego truncar el resultado. Esto es lo que típicamente realizan los compiladores, los resultados intermedios se suelen guardar en una precisión extendida para no perder bits por el camino. Una vez culminada la operación, sí se asignan lo N bits menos significativos del resultado, según la precisión en la que se esté guardando.

Saludos,
Federico