Question

Je suis un cours d'informatique et j'essaie d'établir, à coup sûr , si mon ordinateur basé sur AMD est une petite machine endian? Je crois que c’est parce que ce serait compatible avec Intel.

Plus précisément, mon processeur est un processeur AMD 64 Athlon x2.

Je comprends que cela peut avoir une importance dans la programmation en C. J'écris des programmes C et une méthode que j'utilise serait affectée par cela. J'essaie de savoir si j'obtiendrais les mêmes résultats si j'exécutais le programme sur une machine Intel (en supposant que la est la , petite machine endian).

Enfin, permettez-moi de poser la question suivante: toutes les machines capables d’exécuter Windows (XP, Vista, 2000, Server 2003, etc.) et, par exemple, Bureau Linux Ubuntu être un petit boutiste?

Merci,
Frank

Était-ce utile?

La solution

Toutes les machines x86 et x86-64 (ce qui n’est qu’une extension de x86) sont des ordinateurs little-endian.

Vous pouvez le confirmer avec quelque chose comme ceci:

#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;
}

Autres conseils

L’article Écriture de code indépendant de Endian en C

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

En supposant que Python soit installé, vous pouvez exécuter cette ligne unique, qui imprimera " little " sur les machines little-endian et "gros" sur les big-endian:

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

"Intel-compatible" n'est pas très précis.

Intel fabriquait des processeurs big-endian, notamment StrongARM et XScale. Celles-ci n’utilisent pas l’ISA IA32, communément appelé x86.

Plus loin dans l’histoire, Intel a également conçu les little-endian i860 et i960, qui ne sont pas non plus compatibles x86.

Plus loin dans l’histoire, les prédécesseurs du x86 (8080, 8008, etc.) ne sont pas non plus compatibles x86. En tant que processeurs 8 bits, l’endianisme n’a pas vraiment d'importance…

De nos jours, Intel fabrique toujours l’Itanium (IA64), qui est bi-endian: le fonctionnement normal est big-endian, mais le processeur peut également fonctionner en mode little-endian. Il est possible d’exécuter du code x86 en mode little-endian, mais l’ISA natif n’est pas IA32.

À ma connaissance, tous les processeurs d’AMD sont compatibles x86, avec certaines extensions comme x86_64, et sont donc nécessairement de petite taille.

Ubuntu est disponible pour x86 (little-endian) et x86_64 (little-endian), avec des ports moins complets pour ia64 (big-endian), ARM (el) (little-endian), PA-RISC (big-endian) , bien que le processeur prenne en charge les deux), PowerPC (big-endian) et SPARC (big-endian). Je ne crois pas qu'il existe un port ARM (eb) (big-endian).

En réponse à votre dernière question, la réponse est non. Linux est capable de fonctionner sur de grosses machines comme les PowerMac de la génération précédente.

Vous devez télécharger une version d'Ubuntu conçue pour les machines big endian. Je ne connais que les versions PowerPC . Je suis sûr que vous pouvez trouver un endroit ayant une implémentation big-endian plus générique.

/* by Linas Samusas  */

#ifndef _bitorder 
#define _bitorder 0x0008

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

et utilisez cette

#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

si LE

unsigned long number1 = Function_Convert_to_be_16(number2);

* la macro appellera la fonction réelle et sera convertie en BE

si BE

<*>

* la macro sera définie comme un mot et non une fonction et votre numéro sera entre crochets

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top