Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Endianness

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 3

Endianness

(Redirigido desde «Big-endian»)

El término inglés endianness ("extremidad") designa el formato en el que se almacenan los


datos de más de un byte en un ordenador. El problema es similar a los idiomas en los que se
escriben de derecha a izquierda, como el árabe, o el hebreo, frente a los que se escriben de
izquierda a derecha, pero trasladado de la escritura al almacenamiento en memoria de
los bytes.
No se debe confundir trivialmente el orden de escritura textual en este artículo con el orden de
escritura en memoria, por ello establecemos que lo que escribimos primero lleva índices de
memoria más bajos, y lo que escribimos a continuación lleva índices más elevados, que lo que
lleva índices bajos es previo en memoria, y así sucesivamente, siguiendo la ordenación
natural de menor a mayor, por ejemplo la secuencia {0,1,2} indicaría, -algo más allá de la
intuición- que 0 es previo y contiguo en el espacio de memoria a 1, etc.
Usando este criterio el sistema big-endian adoptado por Motorola entre otros, consiste en
representar los bytes en el orden "natural": así el valor hexadecimal0x4A3B2C1D se
codificaría en memoria en la secuencia {4A, 3B, 2C, 1D}. En el sistema little-endian adoptado
por Intel, entre otros, el mismo valor se codificaría como {1D, 2C, 3B, 4A}, de manera que de
este modo se hace más intuitivo el acceso a datos, porque se efectúa fácilmente de manera
incremental de menos relevante a más relevante (siempre se opera con incrementos de
contador en la memoria), en un paralelismo a "lo importante no es como empiezan las cosas,
sino como acaban."
Algunas arquitecturas de microprocesador pueden trabajar con ambos formatos
(ARM, PowerPC, DEC Alpha, PA-RISC, Arquitectura MIPS), y a veces son referidas como
sistemas middle-endian.
La nomenclatura de los criterios little-endian y big-endian proviene de la novela Los viajes de
Gulliver de Jonathan Swift, y se puede entender como "de comienzo por el extremo pequeño"
y "de comienzo por el extremo mayor", aunque es propenso a confundirse con "acaba en
pequeño" y "acaba en grande" respectivamente. Su etimología proviene de un juego de
palabras en inglés con los términos compuestos little-end-in y big-end-in.1

Índice
[ocultar]

 1 Ejemplo
 2 Ejemplo 2
 3 Ejemplo 3
 4 Ejemplo 4
 5 Ejemplo 5
 6 Referencias
 7 Enlaces externos

Ejemplo[editar]
Un código simple en lenguaje C para detectar si una máquina es little-endian o big-endian:
#include <stdio.h>

int main(void)
{
int i = 1;
char *p = (char *) &i;
if ( p[0] == 1 )
printf("Little Endian\n");
else
printf("Big Endian\n");
return 0;
}
La explicación de su funcionamiento es sencilla, primero obtenemos la dirección de memoria
de un entero (por tanto su espacio de almacenamiento es de al menos 16 bits, i.e. 2 bytes) de
valor 1, 0001h en hexadecimal. Descomponiendo numéricamente en bytes el valor 00h es el
de mayor importancia numérica y el 01h el de menor. Lo que hacemos entonces es
leer (desde memoria) solamente el primer byte del mismo (de ahí el cast a char*), y si es 0
(00h) entonces la ordenación es de comienzo por el extremo mayor (big-endian), si es 1
(0x01) es de de comienzo por el extremo menor (little-endian).

Ejemplo 2[editar]
Este está basado en el orden de lectura de los bytes
#include <stdio.h>
int main()
{
union {
short s;
char c[sizeof(short)];
} un;
un.s = 0x0102;
if(sizeof(short) == 2)
{
if(un.c[0] == 1 && un.c[1] == 2)
printf("big-endian\n");
else if(un.c[0] == 2 && un.c[1] == 1)
printf("little-endian\n");
else
printf("unknown\n");
}
else
{
printf("sizeof(short) = %d\n", sizeof(short));
}
return(0);
}
Ejemplo 3[editar]
Utilizando estructuras union
union endianness
{
short short_16; //
[______16______]
unsigned char char_8[sizeof(short)]; //
[___8__][___8__]
}endianness;

endianness.short_16 = 0xFF00; // 1111 1111 0000


0000 en binario

(endianness.char_8[0] == 0x00 && endianness.char_8[1] == 0xFF)?


printf("Little endian\n"):
printf("Big endian\n");

Ejemplo 4[editar]
Utilizando el modulo sys del lenguaje Python
import sys
print sys.byteorder # 'little' o 'big'

Ejemplo 5[editar]
Utilizando el lenguaje Perl
use Config;
print $Config{byteorder} == 12345678 ? 'little-endian' : 'big-endian';

Referencias[editar]

1. Volver arriba↑ «Explanation of Big Endian and Little Endian Architecture».

Enlaces externos[editar]

 Endianess: Big Endian y Little Endian


 El formato "Big Endian" y el "Little Endian"

También podría gustarte