Использует ли моя машина на основе AMD порядок с прямым или прямым порядком байтов? - PullRequest
30 голосов
/ 22 июня 2009

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

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

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

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

Спасибо,
Frank

Ответы [ 7 ]

66 голосов
/ 22 июня 2009

Все машины 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;
}
12 голосов
/ 22 июня 2009

Простой способ узнать, что такое endiannes, указан в статье Написание независимого от порядкового номера кода на C

const int i = 1;
#define is_bigendian() ( (*(char*)&i) == 0 )
11 голосов
/ 24 июня 2009

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

python -c "import struct; print 'little' if ord(struct.pack('L', 1)[0]) else 'big'"
6 голосов
/ 22 июня 2009

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

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

В далеком прошлом Intel также выпустила младшие порядковые номера i860 и i960, которые также не совместимы с x86.

Еще в истории предшественники x86 (8080, 8008 и т. Д.) Также не совместимы с x86. Будучи 8-битными процессорами, порядок байтов не имеет значения ...

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

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

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

3 голосов
/ 22 июня 2009

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

2 голосов
/ 22 июня 2009

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

1 голос
/ 12 февраля 2014
/* 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);

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

если БЫТЬ

unsigned long number1 = Function_Convert_to_be_16(number2);

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

...