Großer und kleiner Endian in C-Sprache

1. Was ist das große und kleine Ende?

Der große und der kleine Endian sind zwei Möglichkeiten zum Speichern von Bytes im Speicher, einer ist der Big-Endian-Speicher und der andere ist der Little-Endian-Speicher. Der Hauptunterschied zwischen der Verwendung des Größenmodus zum Speichern des Datenendes ist die Bytereihenfolge der Speicherung. Die Big-Endian-Methode speichert die höherwertigen Bits an der niedrigen Adresse, und die Little-Endian-Methode speichert die höherwertigen Bits an der hohe Adresse. Die Datenspeicherung auf Big-Endian-Weise entspricht dem normalen menschlichen Denken, während die Datenspeicherung auf Little-Endian-Weise für die Computerverarbeitung von Vorteil ist.

Fügen Sie hier eine Bildbeschreibung ein

Big-Endian-Speicher : Der Low-Endian-Inhalt einer Nummer wird an der High-Adresse und der High-Endian-Inhalt an der Low-Adresse gespeichert.
Little-Endian-Speicher : Der Low-Endian-Inhalt einer Nummer wird an der Low-Adresse und der High-Endian-Inhalt an der High-Adresse gespeichert.

2. Die Bedeutung des großen Endes

Die vom Internet verwendete Netzwerkbyte-Reihenfolge verwendet den Big-Endian-Modus für die Adressierung, während die Host-Byte-Reihenfolge je nach Prozessor variiert. Beispielsweise verwendet der PowerPC- Prozessor den Big-Endian-Modus , während der Pentuim-Prozessor den Little-Endian-Modus verwendet .

Da PowerPC- Prozessoren den Netzwerkmarkt dominieren, kann gesagt werden, dass die meisten Kommunikationsgeräte PowerPC- Prozessoren für die Protokollverarbeitung und andere Steuerinformationsverarbeitung verwenden. Es kann auch sein, dass die meisten Protokolle im Netzwerk die Big-Endian-Adressierung verwenden. Daher muss beim Software-Design des Netzwerkprotokolls der Prozessor, der den Little-Endian-Modus verwendet, die Endmodusänderung in der Software handhaben.

Der Pentium dominiert den PC-Markt, daher verwenden die meisten Peripheriegeräte für PCs den Little-Endian-Modus, einschließlich einiger, die in einem PCI-Bus für Netzwerkgeräte, Flash und anderen Geräten verwendet werden. Dies erfordert auch, dass die Hardware-Ingenieure den Hardware-Endmodus für die Aufmerksamkeitskonvertierung entwerfen.

3. So bestimmen Sie das Größenende

3.1 Verwenden Sie das Konsortium zum Erkennen

3.1.1 Konsortium

Bevor wir den großen und den kleinen Endian entdecken, wollen wir zunächst verstehen, was die Vereinigung in der C-Sprache ist.
In der Sprache C verwies Commonwealth auch auf Union , wobei das Schlüsselwort Union ist .
Die allgemeine Form der Definition eines Unionstyps lautet:

union 联合名
{
    
    
	成员表
};

Die Anzahl der von der Union belegten Bytes entspricht der Anzahl der Bytes, die vom größten Datentyp in seinen Mitgliedern belegt werden, zum Beispiel:

union Un
{
    
    
	int a;
	char b;
}un;

Das Mitglied a der Union ist vom Typ int und belegt vier Bytes, und das Mitglied b ist vom Typ char und belegt ein Byte, sodass die Union Un vier Bytes im Speicher belegt und die Mitglieder der Union einen Speicherplatz gemeinsam nutzen können. Der Speicher kann folgendermaßen ausgedrückt werden:
Fügen Sie hier eine Bildbeschreibung ein
Aufgrund der Eigenschaften der Vereinigung können Sie durch Abfangen von b den Speichermodus der Bytereihenfolge kennen, dh ob es sich um einen Big-Endian oder einen Small-Endian handelt.

3.1.2 Codeerkennung
#include <stdio.h>
int Check_sys()
{
    
    
    union Un
    {
    
    
        char c;
        int i;
    }un;
    un.i = 1;
    //如果是大端机则是0x1000 0000 0000 0000
    //如果是小端机则是0x0000 0000 0000 0001
    return un.c;
}

int main()
{
    
    
    int ret=Check_sys();//由于联合体的特性,大端机ret=0(0000),小端机ret=1(0001)
    if (1 == ret)
    {
    
    
        printf("当前模式为小端存储\n");
    }
    else
    {
    
    
        printf("当前模式为大端存储\n");
    }
    return 0;
}

Ausgabeergebnis:
Fügen Sie hier eine Bildbeschreibung ein

3.2 Verwenden Sie Zeiger zum Erkennen

Ein int- Zeiger wird jedes Mal um 4 Bytes versetzt, und ein char- Zeiger wird jedes Mal um ein Byte versetzt, dann können die Bytes im Speicher auf ähnliche Weise wie bei der obigen Vereinigung auf Größe abgefangen werden. Beurteilung

int Check_sys()
{
    
    
	int a = 1;
	char* p = (char*)&a;
	return *p;  //大端返回0,小端返回1
}
int main()
{
    
    
	int ret = Check_sys();
	if (1 == ret)
	{
    
    
		printf("当前模式为小端存储\n");
	}
	else
	{
    
    
		printf("当前模式为大端存储\n");
	}
	return 0;
}

Testergebnisse:
Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/weixin_45137562/article/details/115047607
Empfohlen
Rangfolge