Domanda

Sto seguendo un corso di sistema informatico e sto provando a stabilire, di sicuro , se il mio computer basato su AMD è una piccola macchina endian? Credo che sia perché sarebbe compatibile con Intel.

In particolare, il mio processore è un AMD 64 Athlon x2.

Capisco che questo può importare nella programmazione C. Sto scrivendo programmi C e un metodo che sto usando ne risentirebbe. Sto cercando di capire se otterrei gli stessi risultati se avessi eseguito il programma su una macchina basata su Intel (supponendo che sia una piccola macchina endian).

Infine, lascia che ti chieda: qualsiasi macchina in grado di eseguire Windows (XP, Vista, 2000, Server 2003, ecc.) e, diciamo, desktop Ubuntu Linux essere little endian?

Grazie,
Frank

È stato utile?

Soluzione

Tutte le macchine x86 e x86-64 (che è solo un'estensione di x86) sono little-endian.

Puoi confermarlo con qualcosa del genere:

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

Altri suggerimenti

Un modo semplice per conoscere gli endiannes è elencato nell'articolo Scrittura di codice indipendente da endian in C

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

Supponendo che tu abbia installato Python, puoi eseguire questo one-liner, che stamperà "poco" su macchine little endian e "big" su quelli big-endian:

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

" Intel-compatibile " non è molto preciso.

Intel utilizzava processori big-endian, in particolare StrongARM e XScale. Questi non usano IA32 ISA, comunemente noto come x86.

Più indietro nella storia, Intel ha anche realizzato i860 e i960 little-endian, che non sono nemmeno compatibili con x86.

Più indietro nella storia, neanche i precedenti di x86 (8080, 8008, ecc.) non sono compatibili con x86. Essendo processori a 8 bit, l'endianness non ha molta importanza ...

Oggi Intel produce ancora l'Itanium (IA64), che è bi-endian: il normale funzionamento è big-endian, ma il processore può anche funzionare in modalità little-endian. Capita di essere in grado di eseguire il codice x86 in modalità little-endian, ma l'ISA nativo non è IA32.

Per quanto ne so, tutti i processori AMD sono compatibili con x86, con alcune estensioni come x86_64, e quindi sono necessariamente little-endian.

Ubuntu è disponibile per x86 (little-endian) e x86_64 (little-endian), con porte meno complete per ia64 (big-endian), ARM (el) (little-endian), PA-RISC (big-endian , sebbene il processore supporti entrambi), PowerPC (big-endian) e SPARC (big-endian). Non credo ci sia una porta ARM (eb) (big-endian).

In risposta alla tua ultima domanda, la risposta è no. Linux è in grado di funzionare su macchine big endian come ad esempio i PowerMac di vecchia generazione.

Devi scaricare una versione di Ubuntu progettata per macchine big endian. Conosco solo le PowerPC . Sono sicuro che puoi trovare un posto che ha un'implementazione big-endian più generica.

/* by Linas Samusas  */

#ifndef _bitorder 
#define _bitorder 0x0008

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

e usa questo

#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

se LE

unsigned long number1 = Function_Convert_to_be_16(number2);

* la macro chiamerà funzione reale e si convertirà in BE

se BE

<*>

* la macro verrà definita come parola non una funzione e il tuo numero sarà tra parentesi

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top