En la primer solución el rango del bucle (i) va de -32768 a 32767, porque recorre los números válidos para la entrada (en complemento a 2).
Pero al momento de guardar el mapeo ROM[numero] = valor_calculado se debe indizar la ROM de acuerdo al código binario de 16 bits asociado al número. Es decir, un número que va de 0 a 65535. Pero los enteros en esa solución son de 20+ bits (la solución dice tomar por ejemplo 32 bits).
Entonces al aplicarle la máscara con 0xFFFF se está quedando con los 16 bits menos significativos del número a mapear que corresponden con la dirección de la ROM que se desea asignar.
Por ejemplo, suponete que i vale -1.
Si uno accediera directamente a ROM[i] estaría mal porque estaría accediendo a ROM[-1] y ROM va de 0 a 65535.
Pero si vemos el código binario en complemento a 2 de 32 bits de -1 es 0xFFFFFFFF. Al aplicarle la máscara con 0xFFFF el resultado da 0xFFFF (65535) es es el índice que hay que utilizar para mapear el caso i=-1.
En la segunda solución el bucle va de 0 a 65535 (es decir los indices de la ROM que quiere asignar).
Saludos,
Gustavo
Pero al momento de guardar el mapeo ROM[numero] = valor_calculado se debe indizar la ROM de acuerdo al código binario de 16 bits asociado al número. Es decir, un número que va de 0 a 65535. Pero los enteros en esa solución son de 20+ bits (la solución dice tomar por ejemplo 32 bits).
Entonces al aplicarle la máscara con 0xFFFF se está quedando con los 16 bits menos significativos del número a mapear que corresponden con la dirección de la ROM que se desea asignar.
Por ejemplo, suponete que i vale -1.
Si uno accediera directamente a ROM[i] estaría mal porque estaría accediendo a ROM[-1] y ROM va de 0 a 65535.
Pero si vemos el código binario en complemento a 2 de 32 bits de -1 es 0xFFFFFFFF. Al aplicarle la máscara con 0xFFFF el resultado da 0xFFFF (65535) es es el índice que hay que utilizar para mapear el caso i=-1.
En la segunda solución el bucle va de 0 a 65535 (es decir los indices de la ROM que quiere asignar).
Saludos,
Gustavo