Моя машина на базе AMD использует прямой или обратный порядок байтов?

StackOverflow https://stackoverflow.com/questions/1024951

Вопрос

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

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

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

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

Спасибо,
Откровенный

Это было полезно?

Решение

Все машины 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, указан в статье Написание независимого от байтов кода на C

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

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

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

«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).

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

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

/* 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

если BE

<*>

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top