Sagen wir, ich habe 4 Byte und ich möchte es in 2Byte kurze Ganzzahl umwandeln. Habe ich recht, dass in beiden (Little und Big Endian) die kurze ganze Zahl aus 2 niedrigstwertigen Bytes dieser 4 Byte Zahl besteht?
Zweite Frage:
Was wird das Ergebnis eines solchen Codes im Little-Endian- und Big-Endian-Prozessor sein?
IMHO in Big-Endian-Prozessor 2 höchstwertigen Bytes würden kopiert werden, und in Little Endian 2 würden niederwertigste Bytes kopiert werden.
Bin ich richtig, dass in beiden kurzen Integer aus 2 niedrigstwertigen Bytes dieser 4-Byte-Integer bestehen?
Ja, per Definition.
Der Unterschied zwischen bigE und littleE ist, ob das niedrigstwertige Byte die niedrigste Adresse hat oder nicht. Auf einem kleinen Endian-Prozessor sind die niedrigsten Adressen die niedrigstwertigen Bits, x86 macht es auf diese Weise.
Diese ergeben das gleiche Ergebnis bei wenig E.
%Vor%Auf einem Big-Endian-Prozessor sind die höchsten Adressen die niedrigstwertigen Bits, 68000 und Power PC machen es so (eigentlich kann Power PC beides sein, aber PPC-Maschinen von Apple verwenden bigE)
Diese geben das gleiche Ergebnis auf großen E.
%Vor%Wie Sie also sehen können, erlaubt Little Endian Ihnen, die kleinsten signifikanten Bits eines Operanden zu erhalten, ohne zu wissen, wie groß er ist. Little E hat Vorteile, um die Rückwärtskompatibilität zu erhalten.
Was ist der Vorteil von Big Endian? Es erzeugt Hex-Dumps, die einfacher zu lesen sind.
Wirklich, die Ingenieure von Motorola dachten, dass die Entlastung beim Lesen von Hex-Dumps wichtiger ist als die Rückwärtskompatibilität. Die Ingenieure von Intel glaubten das Gegenteil.
Ja. Wenn Sie Werte konvertieren, müssen Sie sich keine Gedanken um Endianess machen.
Ja. Wenn Sie Zeiger konvertieren, tun Sie das.
Zuallererst magst du es bereits wissen, aber lass mich erwähnen, dass die Größe von int nicht garantiert 4 Bytes und die von kurzen 2 Bytes auf allen Plattformen ist.
Wenn Sie in Ihrer ersten Frage so etwas meinen:
%Vor% dann ja, s
enthält das untere Byte (s) von i
.
Ich denke, die Antwort auf Ihre zweite Frage ist auch Ja; auf der Byte-Ebene kommt die Endianness des Systems ins Spiel.
Sie sollten sich bewusst sein, dass Ihr zweites Beispiel
ist %Vor%ist kein gültiger C-Code, da er strenge Aliasregeln verletzt. Es wird wahrscheinlich unter einigen Optimierungsebenen und / oder Compilern fehlschlagen.
Benutze dazu Vereinigungen:
%Vor%Wie Sie bereits angemerkt haben, können Sie nicht davon ausgehen, dass Ihre Eingaben 4 Byte betragen. Verwenden Sie besser int32_t und int16_t, wenn Sie bestimmte Größen benötigen.
Wenn Sie wirklich ein int in ein short umwandeln wollen, tun Sie das einfach:
%Vor%Sie müssen sich nicht einmal Gedanken um Endian machen, die Sprache erledigt das für Sie. Wenn Sie sicher sind, dass n innerhalb der Reichweite eines Kurzschlusses liegt, können Sie die Überprüfung ebenfalls überspringen.
Tags und Links c pointers casting endianness