Использует ли моя машина на базе AMD little endian или big endian?

Я собираюсь пройти курс компьютерной системы, и я пытаюсь установить, точно, Если мой компьютер на базе AMD немного endian машина? Я считаю, что это потому, что это будет совместимо с Intel.

в частности, мой процессор-AMD 64 Athlon x2.

Я понимаю, что это может иметь значение в программировании на C. Я пишу программы на C, и на метод, который я использую, это повлияет. Я пытаюсь выяснить, получу ли я те же результаты, если я запустил программа на машине на базе Intel (при условии, что is обратным порядком байтов машина).

наконец, позвольте мне спросить: будут ли все машины, способные работать под управлением Windows (XP, Vista, 2000, Server 2003 и т. д.), и, скажем, Ubuntu Linux desktop быть с обратным порядком байтов?

Спасибо,
Фрэнк!--3-->

8 ответов


все x86 и x86-64 машины (это просто расширение архитектуры x86) являются прямым порядком байтов.

вы можете подтвердить это чем-то вроде этого:

#include <stdio.h>
int main() {
    int a = 0x12345678;
    unsigned char *c = (unsigned char*)(&a);
    if (*c == 0x78) {
       printf("little-endian\n");
    } else {
       printf("big-endian\n");
    }
    return 0;
}

простой способ узнать endiannes указан в статье написание независимого от endian кода в C

const int i = 1;
#define is_bigendian() ( (*(char*)&i) == 0 )

предполагая, что у Вас установлен Python, вы можете запустить этот однострочный, который будет печатать " маленький "на машинах little-endian и" большой " на машинах big-endian:

python -c "import struct; print 'little' if ord(struct.pack('L', 1)[0]) else 'big'"

"Intel-совместимый" не очень точно.

Intel используется для создания процессоров big-endian, в частности StrongARM и XScale. Они не используют ia32 ISA, обычно известный как x86.

далее в истории Intel также сделала маленькие конечные i860 и i960, которые также не совместимы с x86.

дальше назад в историю, prececessors в x86 (8080, 8008 и т. д.) также не совместимы с x86. Будучи 8-битными процессорами, endianness на самом деле не вопрос...

В настоящее время Intel по-прежнему делает Itanium (IA64), который является bi-endian: нормальная работа является big-endian, но процессор также может работать в режиме little-endian. Случается, что он может запускать x86-код в режиме little-endian, но собственный ISA не является IA32.

насколько мне известно, все процессоры AMD были x86-совместимыми с некоторыми расширениями, такими как x86_64, и, следовательно, обязательно мало-конечными.

Ubuntu доступен для x86 (little-endian) и x86_64 (little-endian), с менее полными портами для ia64(big-endian), ARM (el) (little-endian), PA-RISC (big-endian, хотя процессор поддерживает оба), PowerPC (big-endian) и SPARC (big-endian). Я не верю, что есть порт ARM(eb) (big-endian).


в ответ на ваш последний вопрос, ответа нет. Linux способен работать на больших машинах endian, таких как, например, PowerMacs старшего поколения.


вы должны загрузить версию Ubuntu, предназначенную для больших машин endian. Я знаю только PowerPC версий. Я уверен, что вы можете найти место, которое имеет более общую реализацию big-endian.


Endianness Белый документ от Intel Corp опубликовано Ноябрь 15, 2004 http://www.intel.com/design/intarch/papers/endian.pdf

Contents
=========
Introduction .................................................5
Analysis     .................................................5
    Code Portability .........................................5
    Shared Data ..............................................5
    Best Known Methods .......................................5

Definition of Endianness .....................................5

Merits of Endian Architectures ...............................6
    Relevance of Endian Order ................................7

Byte Swapping ................................................8
    Byte Swapping Methods ....................................8
        Network I/O Macros ...................................8
        Custom Byte Swap Macros ..............................9
    Byte Swap Controls .......................................9
        Compile Time Controls ...............................10
        Run Time Controls ...................................10
    Recovering Byte Swap Overhead ...........................11

Platform Porting Considerations .............................11
    Data Storage and Shared Memory ..........................11
    Data Transfer ...........................................12
    Data Types ..............................................12
        Unions ..............................................12
        Byte Arrays .........................................12
        Bit Fields and Bit Masks ............................12
        Pointer Casts .......................................13
    Native Data Types .......................................14

Endian-Neutral Code .........................................14

Guidelines for Implementing Endian-neutral Code .............15
    Endian-neutral Coding Practices .........................15
    Code Analysis ...........................................15
        The Good ............................................16
        The Bad .............................................16
        The Ugly ............................................16

Converting Endian-specific to Endian-neutral Code ...........16

Reversing Endian-specific Architecture of Code ..............16

Conclusion ..................................................17

/* by Linas Samusas  */

#ifndef _bitorder 
#define _bitorder 0x0008

#if (_bitorder > 8)
#define BE
#else
#define LE
#endif

и использовать этот

#ifdef LE
#define Function_Convert_to_be_16(value)  real_function_to_be_16(value)
#define Function_Convert_to_be_32(value)  real_function_to_be_32(value)
#define Function_Convert_to_be_64(value)  real_function_to_be_64(value)
#else
#define Function_Convert_to_be_16
#define Function_Convert_to_be_32
#define Function_Convert_to_be_64
#endif

если LE

unsigned long number1 = Function_Convert_to_be_16(number2);

*макрос вызовет реальную функцию, и она преобразуется в

если бы

unsigned long number1 = Function_Convert_to_be_16(number2);

*макрос будет определен как слово, а не функция, и ваш номер будет заключен в скобки