[2024][Julio][[Problema2c]

[2024][Julio][[Problema2c]

de Agustín Marcio Ribeiro García -
Número de respuestas: 6

Buenas, si bien comprendí la solución que está subida, quería saber si la forma en la que planteé el cargado de la ROM es coherente. Aprovecho también para preguntar dos dudas sobre este tema:

1- Si a una variable unsigned char (8 bits) le asigno un int (32 bits), ¿se queda con los 8 bits más o menos significativos? (en este programa lo hice de la segunda manera).

2- Al hacer el & entre dos números de tamaño distinto, ¿el número más pequeño se completa con ceros a la izquierda? Por ejemplo, 1010 1010 & 1111, ¿se evalúa como 1010 1010 & 0000 1111? (en este programa usé esa lógica).

Desde ya, muchas gracias!

En respuesta a Agustín Marcio Ribeiro García

Re: [2024][Julio][[Problema2c]

de Federico Rivero -
Hola Agustín.

Respondo entrelíneas:

1- Si a una variable unsigned char (8 bits) le asigno un int (32 bits), ¿se queda con los 8 bits más o menos significativos? (en este programa lo hice de la segunda manera).

Con los menos significativos.

2- Al hacer el & entre dos números de tamaño distinto, ¿el número más pequeño se completa con ceros a la izquierda? Por ejemplo, 1010 1010 & 1111, ¿se evalúa como 1010 1010 & 0000 1111? (en este programa usé esa lógica).

Sí, se completa con 0's a la izquierda.

Recomiendo leer estas diapositivas (https://eva.fing.edu.uy/pluginfile.php/488391/mod_resource/content/2/Presentacion-practico2.pdf) para profundizar en el tema.

Saludos,
Federico 
En respuesta a Federico Rivero

Re: [2024][Julio][[Problema2c]

de Gonzalo Maria Ferrando Gomez -
Hice, una solución similar a la del compañero.
Federico, se considera correcta?
En respuesta a Gonzalo Maria Ferrando Gomez

Re: [2024][Julio][[Problema2c]

de Federico Rivero -
No había mirado el código. Mirando rápido encuentro 2 errores que hubieran sido costosos:

1) La condición para chequear si el número está fuera de rango es incorrecta (no deberían ser 'ands', ver la solución)
2) Al armar decenas + unidades, las decenas quedan multiplicadas * 16 * 10 porque falta shiftear a la derecha el número antes de multiplicarlo por 10. Debería ser:

(( horas & (0xF << 4) ) >> 4 ) x 10

o más simple:

(horas >> 4) x 10

Saludos,
Federico
En respuesta a Federico Rivero

Re: [2024][Julio][[Problema2c]

de Agustín Marcio Ribeiro García -
Muchas gracias por la Corrección!. Solo para confirmar, cambiando los 'ands' por 'ors,' la condición para chequear que el numero esta fuera de rango estaría bien no? ' (horas_entero>11 | | minutos_entero>59 | | segs_entero>59)'. Saludos
En respuesta a Agustín Marcio Ribeiro García

Re: [2024][Julio][[Problema2c]

de Federico Rivero -

Hola Agustín,

Desafortunadamente tampoco es correcto. Por ejemplo, minutos podría ser 00001111, el cual no representa nada en BCD (el primer nibble representa 0 en BCD y el segundo no representa nada porque 1111 no es un nibble váildo). Sin embargo, va a pasar el chequeo porque minutos va a quedar con el valor '15'. 

En resumen, se debe verificar que los dígitos BCD sean válidos.

Saludos,

       Federico