Endianidad
En computación, endianness es el orden o secuencia de bytes de una palabra de datos digitales en la memoria de la computadora. El endianismo se expresa principalmente como big-endian (BE) o little-endian (LE). Un sistema big-endian almacena el byte más significativo de una palabra en la dirección de memoria más pequeña y el byte menos significativo en la más grande. Un sistema little-endian, por el contrario, almacena el byte menos significativo en la dirección más pequeña. Bi-endianness es una función admitida por numerosas arquitecturas informáticas que cuentan con endian conmutable en la obtención y almacenamiento de datos o para la obtención de instrucciones. Otros ordenamientos se denominan genéricamente middle-endian o mixed-endian.
Endianness también se puede usar para describir el orden en que los bits se transmiten a través de un canal de comunicación, por ejemplo, big-endian en un canal de comunicaciones transmite primero los bits más significativos. Bit-endianness rara vez se usa en otros contextos.
Etimología
Danny Cohen introdujo los términos big-endian y little-endian en informática para la ordenación de datos en una nota de experimento de Internet publicada en 1980.
El adjetivo endian tiene su origen en los escritos del escritor angloirlandés del siglo XVIII Jonathan Swift. En la novela de 1726 Los viajes de Gulliver, retrata el conflicto entre sectas de liliputienses divididas en romper la cáscara de un huevo cocido por el extremo grande o por el pequeño. Debido a que el hijo del emperador se había cortado el dedo al abrir un huevo por el extremo grande, un edicto imperial lo prohibió; aquellos que se rebelaron y lo hicieron fueron llamados "Big-Endians" (Swift no usó el término Little-Endians en el trabajo). Cohen hace explícita la conexión con Los viajes de Gulliver en el apéndice de su nota de 1980.
Anteriormente, el nombre byte sex se usaba a veces para el mismo concepto.
Resumen
Las computadoras almacenan información en grupos de bits binarios de varios tamaños. A cada grupo se le asigna un número, llamado su dirección, que la computadora usa para acceder a esos datos. En la mayoría de las computadoras modernas, el grupo de datos más pequeño con una dirección tiene una longitud de ocho bits y se denomina byte. Los grupos más grandes comprenden dos o más bytes, por ejemplo, una palabra de 32 bits contiene cuatro bytes. Hay dos formas posibles en que una computadora podría numerar los bytes individuales en un grupo más grande, comenzando en cualquier extremo. Ambos tipos de endianness tienen un uso generalizado en la ingeniería electrónica digital. La elección inicial de la endianidad de un nuevo diseño suele ser arbitraria, pero las revisiones y actualizaciones tecnológicas posteriores perpetúan la endianidad existente para mantener la compatibilidad con versiones anteriores.
Internamente, cualquier computadora funcionará igual de bien independientemente del tipo de endian que use, ya que su hardware usará constantemente el mismo tipo de endian para almacenar y cargar sus datos. Por esta razón, los programadores y usuarios de computadoras normalmente ignoran el carácter endian de la computadora con la que están trabajando. Sin embargo, el endianness puede convertirse en un problema cuando se mueven datos externos a la computadora, como cuando se transmiten datos entre diferentes computadoras, o cuando un programador investiga bytes de datos internos de la computadora de un volcado de memoria, y el endianness utilizado difiere de lo esperado. En estos casos, se debe comprender y tener en cuenta el carácter final de los datos.
Estos dos diagramas muestran cómo dos computadoras que usan endianness diferente almacenan un número entero de 32 bits (cuatro bytes) con el valor de 0x0A0B0C0D. En ambos casos, el entero se divide en cuatro bytes, 0x0A, 0x0B, 0x0C< /span> y 0x0D, y los bytes se almacenan en cuatro ubicaciones de bytes secuenciales en la memoria, comenzando con la ubicación de memoria con la dirección a, luego < i>a + 1, a + 2 y a + 3. La diferencia entre big-endian y little-endian es el orden de los cuatro bytes del entero que se almacena.
El diagrama del lado izquierdo muestra una computadora que usa big-endian. Esto inicia el almacenamiento del entero con el byte más significativo, 0x0A, en la dirección a, y finaliza con el byte menos significativo, 0x0D, en la dirección a + 3.
El diagrama del lado derecho muestra una computadora que usa little-endian. Esto inicia el almacenamiento del entero con el byte menos significativo, 0x0D, en la dirección a, y finaliza con el El byte más significativo, 0x0A, en la dirección a + 3.
Dado que cada computadora usa su mismo endianness para almacenar y recuperar el entero, los resultados serán los mismos para ambas computadoras. Pueden surgir problemas cuando la memoria se direcciona mediante bytes en lugar de números enteros, o cuando el contenido de la memoria se transmite entre computadoras con diferente endian.
Big-endianness es el orden dominante en los protocolos de red, como en el conjunto de protocolos de Internet, donde se denomina orden de red, transmitiendo primero el byte más significativo. Por el contrario, little-endianness es el orden dominante para las arquitecturas de procesador (x86, la mayoría de las implementaciones ARM, implementaciones base RISC-V) y su memoria asociada. Los formatos de archivo pueden usar cualquier orden; algunos formatos usan una combinación de ambos o contienen un indicador de qué orden se usa en todo el archivo.
Los estilos big- y little-endian también se pueden usar de manera más general para caracterizar el orden de cualquier representación, p. los dígitos en un sistema numérico o las secciones de una fecha. Los números en notación posicional generalmente se escriben con sus dígitos en orden big-endian de izquierda a derecha, incluso en escritura de derecha a izquierda. De manera similar, los lenguajes de programación utilizan el ordenamiento de dígitos big-endian para los literales numéricos.
Conceptos básicos
La memoria de la computadora consta de una secuencia de celdas de almacenamiento (unidades direccionables más pequeñas); en las máquinas que admiten el direccionamiento de bytes, esas unidades se denominan bytes. Cada byte se identifica y se accede a él en hardware y software por su dirección de memoria. Si el número total de bytes en la memoria es n, las direcciones se enumeran de 0 a n − 1.
Los programas informáticos suelen utilizar estructuras de datos o campos que pueden constar de más datos de los que se pueden almacenar en un byte. En el contexto de este artículo donde su tipo no puede complicarse arbitrariamente, un "campo" consta de una secuencia consecutiva de bytes y representa un "valor de datos simple" que, al menos potencialmente, puede ser manipulado por una única instrucción de hardware. En la mayoría de los sistemas, la dirección de un valor de datos simple de varios bytes es la dirección de su primer byte (el byte con la dirección más baja).
Otro atributo importante de un byte que forma parte de un "campo" es su "importancia". Estos atributos de las partes de un campo juegan un papel importante en la secuencia en que el hardware de la computadora accede a los bytes, más precisamente: por los algoritmos de bajo nivel que contribuyen a los resultados de una instrucción de la computadora.
Números
Los sistemas numéricos posicionales (principalmente en base 2 o, con menor frecuencia, en base 10) son la forma predominante de representar y, en particular, de manipular datos enteros por parte de las computadoras. En forma pura, esto es válido para números enteros no negativos de tamaño moderado, p. del tipo de datos C unsigned
. En tal sistema numérico, el valor de un dígito que contribuye al número entero está determinado no solo por su valor como un solo dígito, sino también por la posición que ocupa en el número completo, llamado su significado Estas posiciones se pueden asignar a la memoria principalmente de dos maneras:
- disminución de la importancia numérica con crecientes direcciones de memoria (o tiempo creciente), conocidas como big-endian y
- creciente importancia numérica con crecientes direcciones de memoria (o tiempo creciente), conocidas como Little-endian.
Los datos enteros que son compatibles directamente con el hardware de la computadora tienen un ancho fijo de una potencia baja de 2, p. 8 bits ≙ 1 byte, 16 bits ≙ 2 bytes, 32 bits ≙ 4 bytes, 64 bits ≙ 8 bytes, 128 bits ≙ 16 bytes. La secuencia de acceso de bajo nivel a los bytes de dicho campo depende de la operación a realizar. Primero se accede al byte menos significativo para sumas, restas y multiplicaciones. Primero se accede al byte más significativo para la división y comparación. Ver § Orden de cálculo.
Para números de coma flotante, consulte § Coma flotante.
Texto
Cuando las cadenas de caracteres (texto) deben compararse entre sí, p. para apoyar algún mecanismo como la clasificación, esto se hace con mucha frecuencia lexicográficamente donde un solo elemento posicional (carácter) también tiene un valor posicional. La comparación lexicográfica significa casi en todas partes: el primer carácter ocupa el primer lugar, como en la guía telefónica.
Los números enteros escritos como texto siempre se representan con el dígito más significativo primero en la memoria, lo que es similar al big-endian, independientemente de la dirección del texto.
Hardware
Muchos procesadores antiguos y existentes utilizan una representación de memoria big-endian, ya sea exclusivamente o como una opción de diseño. Otros tipos de procesadores utilizan representación de memoria little-endian; otros usan otro esquema llamado middle-endian, mixed-endian o PDP-11-endian.
Algunos conjuntos de instrucciones cuentan con una configuración que permite cambiar el endianness en la obtención y el almacenamiento de datos, la obtención de instrucciones o ambas. Esta función puede mejorar el rendimiento o simplificar la lógica de los dispositivos y el software de red. La palabra bi-endian, cuando se refiere al hardware, denota la capacidad de la máquina para calcular o pasar datos en cualquier formato endian.
A veces se denomina problema NUXI a tratar con datos de diferentes endianness. Esta terminología alude a los conflictos de orden de bytes encontrados al adaptar UNIX, que se ejecutaba en el PDP-11 mixto, a una computadora IBM Series/1 big-endian. Unix fue uno de los primeros sistemas en permitir compilar el mismo código para plataformas con diferentes representaciones internas. Se suponía que uno de los primeros programas convertidos debía imprimir Unix
, pero en la Serie/1 imprimía nUxi
en cambio.
IBM System/360 utiliza el orden de bytes big-endian, al igual que sus sucesores System/370, ESA/390 y z/Architecture. El PDP-10 usa direccionamiento big-endian para instrucciones orientadas a bytes. La minicomputadora IBM Series/1 utiliza el orden de bytes big-endian.
El Datapoint 2200 utilizó una lógica serial de bits simple con little-endian para facilitar la propagación del acarreo. Cuando Intel desarrolló el microprocesador 8008 para Datapoint, usaron little-endian para compatibilidad. Sin embargo, como Intel no pudo entregar el 8008 a tiempo, Datapoint usó un equivalente de integración de escala media, pero el little-endian se mantuvo en la mayoría de los diseños de Intel, incluidos el MCS-48 y el 8086 y sus sucesores x86. DEC Alpha, Atmel AVR, VAX, la familia MOS Technology 6502 (incluidos Western Design Center 65802 y 65C816), Zilog Z80 (incluidos Z180 y eZ80), Altera Nios II y muchos otros procesadores y familias de procesadores también son pequeños. endiano
Las series de procesadores Motorola 6800/6801, 6809 y 68000 utilizaban el formato big-endian.
El Intel 8051, a diferencia de otros procesadores Intel, espera direcciones de 16 bits para LJMP y LCALL en formato big-endian; sin embargo, las instrucciones xCALL almacenan la dirección de retorno en la pila en formato little-endian.
SPARC históricamente usó big-endian hasta la versión 9, que es bi-endian.
De manera similar, los primeros procesadores IBM POWER eran big-endian, pero los descendientes de PowerPC y Power ISA ahora son bi-endian.
La arquitectura ARM era little-endian antes de la versión 3 cuando se convirtió en bi-endian.
Arquitecturas más nuevas
Las arquitecturas del conjunto de instrucciones IA-32 y x86-64 utilizan el formato little-endian. Otras arquitecturas de conjuntos de instrucciones que siguen esta convención, que solo permiten el modo little-endian, incluyen Nios II, Andes Technology NDS32 y Qualcomm Hexagon.
Únicamente las arquitecturas big-endian incluyen IBM z/Architecture y OpenRISC.
Algunas arquitecturas de conjuntos de instrucciones son "bi-endian" y permitir la ejecución de software de cualquier endianness; estos incluyen Power ISA, SPARC, ARM AArch64, C-Sky y RISC-V. IBM AIX e IBM i se ejecutan en modo big-endian en Power ISA bi-endian; Linux originalmente se ejecutaba en modo big-endian, pero para 2019, IBM había hecho la transición al modo little-endian para Linux para facilitar la migración del software Linux de x86 a Power. SPARC no tiene una implementación little-endian relevante, ya que tanto Oracle Solaris como Linux se ejecutan en modo big-endian en sistemas SPARC bi-endian y pueden considerarse big-endian en la práctica. ARM, C-Sky y RISC-V no tienen implementaciones big-endian relevantes y pueden considerarse little-endian en la práctica.
Biendianidad
Algunas arquitecturas (incluidas las versiones 3 y superiores de ARM, PowerPC, Alpha, SPARC V9, MIPS, Intel i860, PA-RISC, SuperH SH-4 e IA-64) cuentan con una configuración que permite cambiar el endianness en la obtención de datos y tiendas, búsquedas de instrucciones o ambas. Esta función puede mejorar el rendimiento o simplificar la lógica de los dispositivos y el software de red. La palabra bi-endian, cuando se refiere al hardware, denota la capacidad de la máquina para calcular o pasar datos en cualquier formato endian.
Muchas de estas arquitecturas se pueden cambiar a través del software para que tengan un formato endian específico (generalmente se hace cuando se inicia la computadora); sin embargo, en algunos sistemas, el endianness predeterminado lo selecciona el hardware en la placa base y no se puede cambiar a través del software (por ejemplo, el Alpha, que se ejecuta solo en modo big-endian en el Cray T3E).
Tenga en cuenta que el término bi-endian se refiere principalmente a cómo un procesador trata los accesos a los datos. Los accesos a instrucciones (búsqueda de palabras de instrucción) en un procesador dado aún pueden asumir un endian fijo, incluso si los accesos a datos son totalmente bi-endian, aunque esto no siempre es el caso, como en el procesador basado en IA-64 de Intel. CPU Itanium, que permite ambos.
Tenga en cuenta, también, que algunas CPU nominalmente bi-endian requieren ayuda de la placa base para cambiar completamente el endian. Por ejemplo, los procesadores PowerPC orientados a escritorio de 32 bits en modo little-endian actúan como little-endian desde el punto de vista de los programas en ejecución, pero requieren que la placa base realice un intercambio de 64 bits en todos los carriles de 8 bytes para asegúrese de que la visión little-endian de las cosas se aplique a los dispositivos de E/S. En ausencia de este hardware de placa base inusual, el software del controlador del dispositivo debe escribir en diferentes direcciones para deshacer la transformación incompleta y también debe realizar un intercambio de bytes normal.
Algunas CPU, como muchos procesadores PowerPC diseñados para uso integrado y casi todos los procesadores SPARC, permiten la elección de endian por página.
Los procesadores SPARC desde finales de la década de 1990 (procesadores compatibles con SPARC v9) permiten elegir el estado final de los datos con cada instrucción individual que se carga o almacena en la memoria.
La arquitectura ARM admite dos modos big-endian, denominados BE-8 y BE-32. Las CPU hasta ARMv5 solo admiten BE-32 o el modo invariable de palabra. Aquí cualquier acceso de 32 bits alineado naturalmente funciona como en el modo little-endian, pero el acceso a un byte o palabra de 16 bits se redirige a la dirección correspondiente y no se permite el acceso no alineado. ARMv6 presenta BE-8 o modo invariable de bytes, donde el acceso a un solo byte funciona como en el modo little-endian, pero acceder a una palabra de 16 bits, 32 bits o (a partir de ARMv8) de 64 bits da como resultado un intercambio de bytes de los datos Esto simplifica el acceso a la memoria no alineado, así como el acceso asignado a la memoria a registros que no sean de 32 bits.
Muchos procesadores tienen instrucciones para convertir una palabra en un registro al endian opuesto, es decir, intercambian el orden de los bytes en una palabra de 16, 32 o 64 bits. Sin embargo, todos los bits individuales no se invierten.
Las CPU de arquitectura Intel x86 y x86-64 recientes tienen una instrucción MOVBE (Intel Core desde la generación 4, después de Atom), que obtiene una palabra en formato big-endian de la memoria o escribe una palabra en la memoria en formato big-endian. Por lo demás, estos procesadores son completamente little-endian.
También hay dispositivos que usan diferentes formatos en diferentes lugares. Por ejemplo, el indicador de batería BQ27421 de Texas Instruments utiliza el formato little-endian para sus registros y el formato big-endian para su memoria de acceso aleatorio. Este comportamiento no parece ser modificable.
Coma flotante
Aunque muchos procesadores usan almacenamiento little-endian para todo tipo de datos (enteros, punto flotante), hay varias arquitecturas de hardware en las que los números de punto flotante se representan en formato big-endian mientras que los números enteros se representan en formato little-endian. formulario. Hay procesadores ARM que tienen representación de punto flotante de endian mixto para números de doble precisión: cada una de las dos palabras de 32 bits se almacena como little-endian, pero la palabra más significativa se almacena primero. El punto flotante VAX almacena palabras de 16 bits little-endian en orden big-endian. Debido a que ha habido muchos formatos de punto flotante sin una representación estándar de red para ellos, el estándar XDR usa IEEE 754 big-endian como su representación. Por lo tanto, puede parecer extraño que el estándar de punto flotante IEEE 754 generalizado no especifique el endianness. Teóricamente, esto significa que incluso los datos estándar de punto flotante IEEE escritos por una máquina podrían no ser legibles por otra. Sin embargo, en las computadoras estándar modernas (es decir, que implementan IEEE 754), se puede suponer con seguridad que el endianness es el mismo para los números de coma flotante que para los enteros, lo que hace que la conversión sea sencilla independientemente del tipo de datos. Sin embargo, los pequeños sistemas embebidos que utilizan formatos especiales de punto flotante pueden ser otra cuestión.
Datos de longitud variable
La mayoría de las instrucciones consideradas hasta ahora contienen el tamaño (longitud) de sus operandos dentro del código de operación. Las longitudes de operandos disponibles con frecuencia son 1, 2, 4, 8 o 16 bytes. Pero también hay arquitecturas en las que la longitud de un operando se puede mantener en un campo separado de la instrucción o con el propio operando, p. por medio de una marca denominativa. Este enfoque permite longitudes de operandos de hasta 256 bytes o más. Los tipos de datos de dichos operandos son cadenas de caracteres o BCD. Las máquinas capaces de manipular dichos datos con una instrucción (por ejemplo, comparar, agregar) incluyen IBM 1401, 1410, 1620, System/360, System/370, ESA/390 y z/Architecture, todas ellas de tipo big-endian.
Acceso simplificado a parte de un campo
En la mayoría de los sistemas, la dirección de un valor de varios bytes es la dirección de su primer byte (el byte con la dirección más baja); Los sistemas little-endian de ese tipo tienen la propiedad de que, para valores de datos suficientemente bajos, el mismo valor se puede leer de la memoria en diferentes longitudes sin usar diferentes direcciones (incluso cuando se imponen restricciones de alineación). Por ejemplo, una ubicación de memoria de 32 bits con contenido 4A 00 00 00
se puede leer en la misma dirección que 8 bits (valor = 4A), 16 bits (004A), 24 bits (00004A) o 32 bits (0000004A), todos los cuales conservan el mismo valor numérico. Aunque los programadores de alto nivel rara vez usan directamente esta propiedad little-endian, ocasionalmente la emplean los optimizadores de código y los programadores de lenguaje ensamblador.
En términos más concretos, identidades como esta son el equivalente del siguiente código C que devuelve verdadero en la mayoría de los sistemas little-endian:
sindicato {} uint8_t u8; uint16_t u16; uint32_t u32; uint64_t u64;} u = {} .u64 = 0x4A };puts()u.u8 == u.u16 " u.u8 == u.u32 " u.u8 == u.u64 ? "verdad" : "falso");
Aunque C++ no lo permite, este tipo de código de juego de palabras se permite como "definido por la implementación" por el estándar C11 y se usa comúnmente en el código que interactúa con el hardware.
Por otro lado, en algunas situaciones puede ser útil obtener una aproximación de un valor de varios bytes o varias palabras leyendo solo su parte más significativa en lugar de la representación completa; un procesador big-endian puede leer dicha aproximación usando la misma dirección base que se usaría para el valor total.
Las simplificaciones de este tipo, por supuesto, no son transferibles entre sistemas de diferente endian.
Orden de cálculo
Algunas operaciones en los sistemas numéricos posicionales tienen un orden natural o preferencial en el que deben ejecutarse los pasos elementales. Este orden puede afectar su rendimiento en microcontroladores y procesadores direccionables por bytes a pequeña escala. Sin embargo, los procesadores de alto rendimiento suelen obtener operandos de varios bytes de la memoria en la misma cantidad de tiempo que habrían obtenido un solo byte, por lo que la complejidad del hardware no se ve afectada por el orden de los bytes.
La suma, la resta y la multiplicación comienzan en la posición del dígito menos significativo y propagan el acarreo a la posición posterior más significativa. En la mayoría de los sistemas, la dirección de un valor de varios bytes es la dirección de su primer byte (el byte con la dirección más baja). La implementación de estas operaciones es marginalmente más simple usando máquinas little-endian donde este primer byte contiene el dígito menos significativo.
La comparación y la división comienzan en el dígito más significativo y propagan un posible acarreo a los dígitos menos significativos subsiguientes. Para valores numéricos de longitud fija (típicamente de longitud 1, 2, 4, 8, 16), la implementación de estas operaciones es marginalmente más simple en máquinas big-endian.
Algunos procesadores big-endian (por ejemplo, IBM System/360 y sus sucesores) contienen instrucciones de hardware para comparar lexicográficamente cadenas de caracteres de longitud variable.
El transporte de datos normal por una declaración de asignación es, en principio, independiente de la endianidad del procesador.
Extremo medio
Son posibles muchos otros ordenamientos, genéricamente llamados middle-endian o mixed-endian.
El PDP-11 es, en principio, un sistema little-endian de 16 bits. Las instrucciones para convertir entre valores enteros y de punto flotante en el procesador de punto flotante opcional del PDP-11/45, PDP-11/70, y en algunos procesadores posteriores, almacenaron "entero largo de doble precisión de 32 bits. #34; valores con las mitades de 16 bits intercambiadas del orden esperado de little-endian. El compilador UNIX C usó el mismo formato para enteros largos de 32 bits. Este orden se conoce como PDP-endian.
Una forma de interpretar este endianness es que almacena un entero de 32 bits como dos palabras de 16 bits little-endian, con un orden de palabras big-endian:
crecientes direcciones→ | |||||
0Bh | 0Ah | 0Dh | 0Ch | ||
0A0Bh | 0C0Dh |
Los valores de 16 bits aquí se refieren a sus valores numéricos, no a su diseño real.
Los descriptores de segmento de IA-32 y procesadores compatibles mantienen una dirección base de 32 bits del segmento almacenada en orden little-endian, pero en cuatro bytes no consecutivos, en las posiciones relativas 2, 3, 4 y 7 del inicio del descriptor.
Fechas finales
Las fechas se pueden representar con diferente endianness por el orden del año, mes y día. Por ejemplo, el 13 de septiembre de 2002 se puede representar como:
- fecha pequeña (día, mes, año), 13-09-2002
- fechas medias (meses, día, año), 09-13-2002
- fecha de gran final (año, mes, día), 2002-09-13 con ISO 8601
En la notación de fecha y hora en los Estados Unidos, las fechas son del medio extremo y difieren de los formatos de fecha en todo el mundo.
Direccionamiento de bytes
Cuando los bytes de memoria se imprimen secuencialmente de izquierda a derecha (por ejemplo, en un volcado hexadecimal), la representación little-endian de los enteros tiene un significado que aumenta de izquierda a derecha. En otras palabras, aparece al revés cuando se visualiza, lo que puede ser contrario a la intuición.
Este comportamiento surge, por ejemplo, en FourCC o técnicas similares que implican empaquetar caracteres en un número entero, de modo que se convierta en una secuencia de caracteres específicos en la memoria. Definamos la notación 'John'
como simplemente el resultado de escribir los caracteres en ASCII hexadecimal y agregar 0x
al frente, y de manera análoga para secuencias más cortas (un literal C de varios caracteres, en estilo Unix/MacOS):
J o h n hex 4A 6F 68 6E . - título 0x4A6F686E
En máquinas big-endian, el valor aparece de izquierda a derecha, coincidiendo con el orden correcto de las cadenas para leer el resultado:
crecientes direcciones→ | |||||
4Ah | 6Fh | 68h | 6Eh | ||
'J' | 'o ' | 'h ' | 'n ' |
Pero en una máquina little-endian, uno vería:
crecientes direcciones→ | |||||
6Eh | 68h | 6Fh | 4Ah | ||
'n ' | 'h ' | 'o ' | 'J' |
Las máquinas de gama media complican esto aún más; por ejemplo, en el PDP-11, el valor de 32 bits se almacena como dos palabras de 16 bits 'Jo' 'hn' en big-endian, con los caracteres de las palabras de 16 bits almacenados en little-endian:
crecientes direcciones→ | |||||
6Fh | 4Ah | 6Eh | 68h | ||
'o ' | 'J' | 'n ' | 'h ' |
Intercambio de bytes
El intercambio de bytes consiste en reorganizar los bytes para cambiar el endian. Muchos compiladores proporcionan funciones integradas que probablemente se compilarán en instrucciones nativas del procesador (bswap
/movbe
), como __builtin_bswap32
. Las interfaces de software para el intercambio incluyen:
- Funciones de endianness de red estándar (desde/hasta BE, hasta 32-bit). Windows tiene una extensión de 64 bits en
winsock2.h
. - BSD y Glibc
endian.h
funciones (de/a BE y LE, hasta 64-bit). - macOS
OSByteOrder.h
macros (de/a BE y LE, hasta 64-bit).
Algunos conjuntos de instrucciones de CPU brindan soporte nativo para el intercambio de bytes endian, como bswap
(x86 - 486 y posterior), y rev
(ARMv6 y posteriores).
Algunos compiladores tienen funciones integradas para el intercambio de bytes. Por ejemplo, el compilador Intel Fortran admite el CONVERT código> especificador al abrir un archivo, por ejemplo:
ABRIR(unidad, CONVERTIR='BIG_ENDIAN 39;,...)
. Otros compiladores tienen opciones para generar código que habilita globalmente la conversión para todas las operaciones de E/S de archivos. Esto permite la reutilización del código en un sistema con el endian opuesto sin modificar el código.
Diseño lógico
Los lenguajes de descripción de hardware (HDL) que se utilizan para expresar la lógica digital a menudo admiten endianness arbitrario, con granularidad arbitraria. Por ejemplo, en SystemVerilog, una palabra se puede definir como little-endian o big-endian:
lógica [31:0] little_endian; // bit 0 es el bit menos significativológica [0:31] big_endian; // bit 31 es el bit menos significativológica [0:3[ ]7:0] mixto; // cada byte es pequeño-endian, pero los bytes están empaquetados en orden grande-endian.
Archivos y sistemas de archivos
El reconocimiento de endianness es importante cuando se lee un archivo o sistema de archivos creado en una computadora con endianness diferente.
Los archivos secuenciales sin formato de Fortran creados con un endianness generalmente no se pueden leer en un sistema que usa el otro endianness porque Fortran generalmente implementa un registro (definido como los datos escritos por una sola declaración de Fortran) como datos precedidos y seguidos por campos de conteo, que son números enteros iguales al número de bytes en los datos. Un intento de leer un archivo de este tipo utilizando Fortran en un sistema del otro endian resulta en un error de tiempo de ejecución, porque los campos de conteo son incorrectos.
El texto Unicode puede comenzar opcionalmente con una marca de orden de bytes (BOM) para señalar el carácter endian del archivo o flujo. Su punto de código es U+FEFF. En UTF-32, por ejemplo, un archivo big-endian debe comenzar con 00 00 FE FF; un little-endian debe comenzar con
FF FE 00 00
.
Los formatos de datos binarios de la aplicación, como los archivos .mat de MATLAB, o el formato de datos .bil, que se utilizan en topografía, suelen ser independientes del endian. Esto se logra almacenando los datos siempre en un endianness fijo o llevando con los datos un interruptor para indicar el endianness. Un ejemplo de lo primero es el formato de archivo XLS binario que es portátil entre los sistemas Windows y Mac y siempre de tipo little-endian, lo que requiere que la aplicación de Mac intercambie los bytes al cargar y guardar cuando se ejecuta en un procesador Motorola 68K o PowerPC de tipo big-endian.
Los archivos de imagen TIFF son un ejemplo de la segunda estrategia, cuyo encabezado instruye a la aplicación sobre el carácter endian de sus enteros binarios internos. Si un archivo comienza con la firma MM
, significa que los enteros se representan como big-endian, mientras que II
significa poco-endian. Esas firmas necesitan una sola palabra de 16 bits cada una, y son palíndromos, por lo que son independientes del endianismo. I
significa Intel y M
significa Motorola. Las CPU Intel son little-endian, mientras que las CPU Motorola 680x0 son big-endian. Esta firma explícita permite que un programa de lectura de TIFF intercambie bytes si es necesario cuando un programa de escritura de TIFF generó un archivo dado que se ejecuta en una computadora con un endian diferente.
Como consecuencia de su implementación original en la plataforma Intel 8080, el sistema de archivos de la tabla de asignación de archivos (FAT) independiente del sistema operativo se define con ordenamiento de bytes little-endian, incluso en plataformas que usan otro endian de forma nativa, lo que requiere un intercambio de bytes operaciones de mantenimiento de las FAT en estas plataformas.
Se sabe que ZFS, que combina un sistema de archivos y un administrador de volúmenes lógicos, proporciona endian adaptable y funciona con sistemas big-endian y little-endian.
Redes
Muchos RFC de IETF utilizan el término orden de red, lo que significa el orden de transmisión de bits y bytes por cable en los protocolos de red. Entre otros, el histórico RFC 1700 (también conocido como estándar de Internet STD 2) ha definido que el orden de la red para los protocolos en el conjunto de protocolos de Internet sea big-endian, de ahí el uso del término orden de bytes de red para orden de bytes big-endian.
Sin embargo, no todos los protocolos utilizan el orden de bytes big-endian como orden de red. El protocolo Server Message Block (SMB) utiliza el orden de bytes little-endian. En CANopen, los parámetros de varios bytes siempre se envían primero con el byte menos significativo (little-endian). Lo mismo es cierto para Ethernet Powerlink.
La API de sockets de Berkeley define un conjunto de funciones para convertir enteros de 16 y 32 bits hacia y desde el orden de bytes de la red: htons
(host-to-network-short) y htonl
(host-to-network-long) convierten valores de 16 bits y 32 bits respectivamente de la máquina (host) al orden de la red; ntohs
y ntohl
las funciones se convierten de red a orden de host. Estas funciones pueden no ser operativas en un sistema big-endian.
Mientras que los protocolos de red de alto nivel suelen considerar el byte (principalmente denominado octeto) como su unidad atómica, los protocolos de red más bajos pueden ocuparse de la ordenación de bits dentro de un byte.
Bit endianness
La numeración de bits es un concepto similar a endianness, pero a nivel de bits, no de bytes. Bit endianness o bit-level endianness se refiere al orden de transmisión de bits a través de un medio serial. El análogo a nivel de bit de little-endian (el bit menos significativo va primero) se usa en RS-232, HDLC, Ethernet y USB. Algunos protocolos usan el orden opuesto (por ejemplo, Teletexto, I2C, SMBus, PMBus y SONET y SDH), y ARINC 429 usa un orden para su campo de etiqueta y el otro orden para el resto de la trama. Por lo general, existe una vista consistente de los bits independientemente de su orden en el byte, de modo que este último se vuelve relevante solo en un nivel muy bajo. Una excepción es la función de algunas comprobaciones de redundancia cíclica para detectar todos los errores de ráfaga hasta una longitud conocida, que se estropearía si el orden de los bits es diferente del orden de los bytes en la transmisión en serie.
Además de la serialización, los términos bit endianness y bit-level endianness rara vez se utilizan, ya que las arquitecturas informáticas en las que cada bit individual tiene una dirección única son raras. Se accede a bits individuales o campos de bits a través de su valor numérico o, en lenguajes de programación de alto nivel, nombres asignados, cuyos efectos, sin embargo, pueden depender de la máquina o carecer de portabilidad de software.
Contenido relacionado
IEEE802
ReiserFS
Cifrado de bloque