martes, 16 de agosto de 2016

Big Endian vs. Little Endian

Introducción 

En orden para entender los conceptos de Big Endian y Little Endian, primero debemos entender el concepto de memoria. 

La memoria es un gran arreglo que contiene bytes. En la organización de computadoras no nos referimos con el término de "índice" a las ubicaciones en memoria, en lugar de eso, usamos el termino de "direcciones". Cada dirección almacena un dato de la memoria (arreglo). Cada elemento por lo general es un byte. Existen algunas configuraciones de memoria en donde cada dirección almacena algo que no es un byte, comos ser un bit. Pero estas configuraciones son muy extrañas, así que para fines de este articulo asumiremos que todas las direcciones almacenan únicamente bytes.

Vamos a definir que una palabra son 32 bits, lo cual es lo mismo que decir 4 bytes. Los enteros, números flotantes y las instrucciones MIPS son de 32 bits de largo. Así que... ¿Como podemos almacenar todos estos valores en memoria? Después de todo, cada dirección de memoria solo puede almacenar un único byte, no cuatro bytes.

La respuesta es simple. Dividimos la cantidad de 32 bits en 4 bytes. Por ejemplo supongamos que tenemos la cantidad de 32 bits, escritos como  90AB12CD/16, el cual es hexadecimal. Dado que cada dígito hexadecimal es 4 bits, necesitamos ocho dígitos hexadecimales para representar el valor de 32 bits.

Así que los cuatro bytes son: 90, AB, 12, CD, donde cada byte requiere dos dígitos hexadecimales.

Resulta que hay dos maneras de almacenar esto en memoria.

Big Endian

En Big Endian, se almacena el byte mas significante en la dirección mas pequeña. Así es como se veria: 


Little Endian

En Little Endian, se almacena el byte menos significante en la dirección mas pequeña. Así es como se veria: 


¿Cual tiene mas sentido?

Diferentes ISAs usan diferentes estilos. Aunque pareciera que Big Endian se ve mas natural, ambos modelos tienen sus justificaciones.

Por ejemplo, DEC e IBMs son little endian, mientras que Motorolas and Suns son big endian. Los procesadores MIPS permiten escoger cualquiera de los estilos para ser utilizados, ya sea big o little endian.

¿Por que es este tema tan importante? Supongamos que estamos almacenando valores enteros a un archivo, luego enviamos el archivo a una maquina que usa el endian opuesto al nuestro. Esta discrepancia generaría errores. El valor seria leido al reves y no tendría sentido.

"Endianness", es también un tema importante cuando se envían números por una red. De nuevo, si se envía un valor desde una maquina con un endian en particular a otra con el endian opuesto, tendremos problemas. Esto es aun peor a través de una red, porque podríamos darnos cuenta de que no podemos determinar el tipo de endian de la computadora que nos envió los datos.

La solución es enviar cantidades de cuatro bytes usando "network byte order", el cual es arbitrariamente escogido para ser uno de los dos endian. Si nuestra maquina tiene el mismo endian que network byte order, ningun cambio es necesario. Si no, debemos invertir los bytes.

No hay comentarios:

Publicar un comentario