Misterio pequeño y grande de Endian

 

¿Que son estos?  
Little y big endian son dos formas de almacenar tipos de datos multibyte (int, float, etc.). En las máquinas little endian, el último byte de la representación binaria del tipo de datos multibyte se almacena primero. Por otro lado, en las máquinas big endian, el primer byte de la representación binaria del tipo de datos multibyte se almacena primero. 
Supongamos que el número entero se almacena como 4 bytes (para aquellos que usan compiladores basados ​​en DOS, como C++ 3.0, el número entero es de 2 bytes), entonces se almacenará una variable x con el valor 0x01234567 de la siguiente manera.
 

Little and Big Endian Mystery

 

¿Cómo ver la representación de memoria de tipos de datos multibyte en su máquina?  
Aquí hay un ejemplo de código C que muestra la representación de bytes de int, float y pointer. 
 

c

#include <stdio.h>
 
/* function to show bytes in memory, from location start to start+n*/
void show_mem_rep(char *start, int n)
{
    int i;
    for (i = 0; i < n; i++)
         printf(" %.2x", start[i]);
    printf("\n");
}
 
/*Main function to call above function for 0x01234567*/
int main()
{
   int i = 0x01234567;
   show_mem_rep((char *)&i, sizeof(i));
   getchar();
   return 0;
}

Complejidad de tiempo: O(1)

Espacio Auxiliar: O(1)

Cuando el programa anterior se ejecuta en una máquina Little Endian, da «67 45 23 01» como salida, mientras que si se ejecuta en una máquina Big Endian, da «01 23 45 67» como salida.
¿Hay una manera rápida de determinar el endianismo de su máquina?  
Hay n no. de formas para determinar el endianness de su máquina. Aquí hay una forma rápida de hacer lo mismo. 
 

C++

#include <bits/stdc++.h>
using namespace std;
int main()
{
    unsigned int i = 1;
    char *c = (char*)&i;
    if (*c)
        cout<<"Little endian";
    else
        cout<<"Big endian";
    return 0;
}
 
// This code is contributed by rathbhupendra

C

#include <stdio.h>
int main()
{
   unsigned int i = 1;
   char *c = (char*)&i;
   if (*c)   
       printf("Little endian");
   else
       printf("Big endian");
   getchar();
   return 0;
}

Producción: 
 

Little endian

Complejidad de tiempo: O(1)

Espacio Auxiliar: O(1)

En el programa anterior, un puntero de carácter c apunta a un número entero i. Dado que el tamaño del carácter es de 1 byte cuando se elimina la referencia del puntero del carácter, solo contendrá el primer byte del entero. Si la máquina es little endian entonces *c será 1 (porque el último byte se almacena primero) y si la máquina es big endian entonces *c será 0. 
¿Importa el endianness para los programadores?  
La mayoría de las veces, el compilador se encarga de endianness, sin embargo, endianness se convierte en un problema en los siguientes casos.
Es importante en la programación de redes: suponga que escribe números enteros en un archivo en una máquina little endian y transfiere este archivo a una máquina big endian. A menos que haya una transformación de little endian a big endian, la máquina big endian leerá el archivo en orden inverso. Puede encontrar un ejemplo práctico aquí.
El orden de bytes estándar para redes es big endian, también conocido como orden de bytes de red. Antes de transferir datos en la red, los datos primero se convierten al orden de bytes de la red (big endian). 
A veces importa cuando está utilizando la conversión de tipos, el programa a continuación es un ejemplo.
 

c

#include <stdio.h>
int main()
{
    unsigned char arr[2] = {0x01, 0x00};
    unsigned short int x = *(unsigned short int *) arr;
    printf("%d", x);
    getchar();
    return 0;
}

Complejidad de tiempo: O(1)

Espacio Auxiliar: O(1)

En el programa anterior, una array de caracteres se convierte en un tipo de entero corto sin signo. Cuando ejecuto el programa anterior en una máquina Little Endian, obtengo 1 como salida, mientras que si lo ejecuto en una máquina Big Endian obtengo 256. Para hacer que los programas sean independientes, se debe evitar el estilo de programación anterior. 
¿Qué son los bi-endian?  
Los procesadores Bi-endian pueden ejecutarse en ambos modos, Little y Big Endian.
¿Cuáles son los ejemplos de máquinas little, big endian y bi-endian?  
Los procesadores basados ​​en Intel son little endians. Los procesadores ARM eran little endians. Los procesadores ARM de la generación actual son bi-endian.
Los procesadores Motorola 68K son big endians. Los procesadores PowerPC (de Motorola) y SPARK (de Sun) eran big endian. La versión actual de estos procesadores son bi-endians. 
¿El endianness afecta los formatos de archivo?  
Los formatos de archivo que tienen 1 byte como unidad básica son independientes de endianness, por ejemplo, archivos ASCII. Otros formatos de archivo utilizan algún formato endian fijo, por ejemplo, los archivos JPEG se almacenan en formato big endian. 
¿Cuál es mejor, Little Endian o Big Endian?  
Los términos little y big endian provienen de Los viajes de Gulliver de Jonathan Swift. Dos grupos no podían ponerse de acuerdo por qué extremo se debía abrir un huevo -a- el pequeño o el grande. Al igual que el problema del huevo, no hay ninguna razón tecnológica para elegir la convención de ordenamiento de un byte sobre el otro, por lo que los argumentos degeneran en disputas sobre cuestiones sociopolíticas. Siempre que se seleccione una de las convenciones y se respete de manera consistente, la elección es arbitraria.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *