2009-06-21 10 views
29

Ich gehe, obwohl ein Computer-System-Kurs und ich versuche zu etablieren, für sicher, wenn mein AMD-basierter Computer eine kleine Endian-Maschine ist? Ich glaube es liegt daran, dass es Intel-kompatibel wäre.Verwendet meine AMD-basierte Maschine Little Endian oder Big Endian?

Konkret ist mein Prozessor ein AMD 64 Athlon X2.

Ich verstehe, dass dies in C-Programmierung von Bedeutung sein kann. Ich schreibe C-Programme und eine Methode, die ich verwende, wäre davon betroffen. Ich versuche herauszufinden, ob ich die gleichen Ergebnisse erzielen würde, wenn ich das Programm auf einem Intel basierten Rechner ausführen würde (vorausgesetzt, dass kleine Endian-Maschine ist).

Lassen Sie mich schließlich fragen: Würden alle Maschinen mit Windows (XP, Vista, 2000, Server 2003, usw.) und sagen wir Ubuntu Linux desktop Little Endian sein?

Danke,
Frank

Antwort

65

Alle x86 und x86-64-Maschinen (die x86 nur eine Erweiterung ist) sind Little-Endian.

Sie es mit so etwas wie dies bestätigen können:

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

Es gibt einen kleinen Tippfehler in Ihrem Code am endgültigen pri ntf: printf ("big-endian \ n"); Der Code erlaubte mir zu bestätigen. Vielen Dank. –

+0

Behoben. Danke, dass du es aufgezeigt hast. –

+2

Während es legal ist, ist es eine schlechte Praxis, den Rückgabetyp von main sowie die "return 0" am Ende wegzulassen. –

3

In Antwort auf Ihre letzte Frage ist die Antwort nein. Linux ist in der Lage, auf Big-Endian-Rechnern, wie z. B. den PowerMacs der älteren Generation, zu laufen.

+0

Ist diese Distribution, mit der ich verbunden bin, in der Lage, auf Big Endian zu laufen. Danke, dass Sie diesen Teil meiner Frage angesprochen haben. –

+0

Ich denke, sie fragen, ob diese Betriebssysteme auf kleinen Endian-Maschinen laufen können, was sie können. Ich denke, sie müssen spezielle Versionen für ältere PowerMacs erstellen, da die PowerPC-Architektur Big-Endian ist. – mnuzzo

+2

Jetzt, da Ubuntu ARM-Unterstützung hat, ist es möglich, dass "Ubuntu" auf einem Big-Endian-Prozessor läuft. Kürzliche ARM-Cores können im Little- oder Big-Endian-Modus laufen. – Mark

2

Sie müssen eine Version von Ubuntu für Big-Endian-Maschinen herunterladen. Ich kenne nur die PowerPC Versionen. Ich bin sicher, dass Sie einen Platz finden können, der eine allgemeinere Big-Endian-Implementierung hat.

+0

Ich verstehe. Danke und Danke für den Link. –

+0

Die Ubuntu-Ports der zweiten Klasse umfassen ia64, armel, hppa, powerpc und sparc. In früheren Releases war PowerPC ein Port der ersten Klasse, und es gab eine Version, in der SPARC auch dort war. – ephemient

6

„Intel-kompatibel“ ist nicht sehr genau aufgeführt ist.

Intel verwendet, um Big-Endian-Prozessoren, vor allem die StrongARM und XScale. Diese verwenden nicht die IA32 ISA, die allgemein als x86 bekannt ist.

Weiter zurück in der Geschichte, machte Intel auch die Little-Endian i860 und i960, die auch nicht x86-kompatibel sind.

Weiter zurück in der Geschichte, sind die Vorgänger des x86 (8080, 8008, etc.) auch nicht x86-kompatibel. Als 8-Bit-Prozessoren ist Endianness nicht wirklich wichtig ...

Heutzutage macht Intel immer noch den Itanium (IA64), der Bi-Endian ist: Normaler Betrieb ist Big-Endian, aber der Prozessor kann auch laufen Little-Endian-Modus. Es ist möglich, x86-Code im Little-Endian-Modus auszuführen, aber die native ISA ist nicht IA32.

Soweit ich weiß, sind alle Prozessoren von AMD x86-kompatibel, mit einigen Erweiterungen wie x86_64, und sind daher notwendigerweise Little-Endian.

Ubuntu ist verfügbar für x86 (little-endian) und x86_64 (little-endian), mit weniger vollständigen Ports für ia64 (Big-Endian), ARM (el) (Little Endian), PA-RISC (Big-Endian) Endian, obwohl der Prozessor beides unterstützt), PowerPC (Big-Endian) und SPARC (Big-Endian). Ich glaube nicht, dass es einen ARM (Eb) (Big-Endian) Port gibt.

+0

Wow, danke für das Detail. Dies ist eine großartige Support-Information. –

+1

Zwei kleinere Korrekturen: Endianness ist auch für 8-Bit-Prozessoren wichtig, da einige Anweisungen auf 16-Bit-Größen wie Adressen verweisen ('LDA $ 1234' (Laden eines Bytes von Adresse $ 1234) wird auf dem 6502 mit 'AD 34 12' codiert haben eine andere Architektur als x86 es war die 29000 Serie RISC-Prozessoren, die sehr beliebt in Embedded-Designs wie Laserdrucker war. –

+0

@tristopia Danke für die Info, ich war nicht bewusst von all dem. – ephemient

11

Angenommen, Sie haben Python installiert haben, können Sie diese Einzeiler laufen, die "kleine" auf Little-Endian-Maschinen und "groß" auf Big-Endian diejenigen gedruckt wird:

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

Ich habe Python installiert. Vielen Dank Für den Code: –

1

Endianness White Paper von Intel Corp veröffentlicht 15. November 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 
+1

Ich schätze Ihren Beitrag, aber ein Whitepaper über Endianness (von Intel nicht weniger) ist ein wenig übertrieben für diese Frage, außerdem ist die Frage beantwortet und ist seit einer Weile. –

1
/* by Linas Samusas */ 

#ifndef _bitorder 
#define _bitorder 0x0008 

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

und verwenden diese

#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 

wenn LE

unsigned long number1 = Function_Convert_to_be_16(number2); 

* Makro echte Funktion aufrufen und es wird konvertieren

sein sein, wenn

unsigned long number1 = Function_Convert_to_be_16(number2); 

* Makro als Wort definiert wird keine Funktion und Ihre Nummer wird in Klammern stehen