Endianness

Endianness

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 hexadecimal 0x4A3B2C1D 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]

Contenido

Ejemplo

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, si es 1 (0x01) es de de comienzo por el extremo menor (little-endian).

Ejemplo 2

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

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

Utilizando el modulo sys del lenguaje Python

import sys
print sys.byteorder    # 'little' o 'big'

Referencias

Enlaces externos


Wikimedia foundation. 2010.

Игры ⚽ Нужно решить контрольную?

Mira otros diccionarios:

  • Endianness — Endian redirects here. For the Linux routing/firewall distribution, see Endian Firewall. In computing, the term endian or endianness refers to the ordering of individually addressable sub components within the representation of a larger data item …   Wikipedia

  • Endianness — Schéma récapitulatif des modes de représentation En informatique, certaines données telles que les nombres entiers peuvent être représentées sur plusieurs octets. L ordre dans lequel ces octets sont organisés en mémoire ou dans une communication… …   Wikipédia en Français

  • Endianness — Die Byte Reihenfolge (engl.: Byte Order oder Endianness) bezeichnet die Speicherorganisation für einfache Zahlenwerte, in erster Linie die Ablage von ganzzahligen Werten (Integer) im Arbeitsspeicher. Eine Festlegung des zu verwendenden… …   Deutsch Wikipedia

  • endianness — noun The property of a computer of being either big endian or little endian. When reading and writing data a byte at a time, it is necessary to know the endianness of the computer you are working on …   Wiktionary

  • Endianness — Él término inglés Endianness designa el formato en el que se almacenan los enteros de más de un byte en un ordenador. Hay dos criterios que se han denominado little endian y big endian, y el nombre viene de la novela Los viajes de Gulliver de… …   Enciclopedia Universal

  • endianness — baitų eiliškumas statusas T sritis informatika apibrėžtis ↑Baitų, vaizduojančių skaičiaus skaitmenis, išdėstymo seka kompiuterio atmintyje: pradedant nuo aukščiausios skaičiaus skilties arba nuo žemiausios. Žmogui natūralus išdėstymas pradedant… …   Enciklopedinis kompiuterijos žodynas

  • Big-endian — Endianness En informatique, certaines données telles que les nombres entiers peuvent être représentées sur plusieurs octets. L ordre dans lequel ces octets sont organisés en mémoire ou dans une communication est appelé endianness (mot anglais… …   Wikipédia en Français

  • Big Indian — Endianness En informatique, certaines données telles que les nombres entiers peuvent être représentées sur plusieurs octets. L ordre dans lequel ces octets sont organisés en mémoire ou dans une communication est appelé endianness (mot anglais… …   Wikipédia en Français

  • Big endian — Endianness En informatique, certaines données telles que les nombres entiers peuvent être représentées sur plusieurs octets. L ordre dans lequel ces octets sont organisés en mémoire ou dans une communication est appelé endianness (mot anglais… …   Wikipédia en Français

  • Boutisme — Endianness En informatique, certaines données telles que les nombres entiers peuvent être représentées sur plusieurs octets. L ordre dans lequel ces octets sont organisés en mémoire ou dans une communication est appelé endianness (mot anglais… …   Wikipédia en Français

Compartir el artículo y extractos

Link directo
Do a right-click on the link above
and select “Copy Link”