code frage, is_little_endian, pointer...



  • Der Pointer wird dadurch nicht mehr als int Pointer (int = 4byte) betrachtet,
    sondern als char-pointer (char = 1byte) und da dort keine Modifikationen sind,
    wird einfach das erste (array[0]) byte gelesen. Du könntest auch das zweite
    auslesen -> **(((char )&x)[1])



  • is_little_endian.c:3: warning: return makes integer from pointer without a cast
    is_little_endian.c:3: warning: function returns address of local variable

    hihi.. d.h. es würde gehen, aber mit dem *(...) castet man den pointer auf die adresse wieder auf einen integer... seh ich jetzt mal so...

    💡 thx 🙂



  • Ok, hatte nen kleinen Fehler drin, es wird ja bereits durch den Index-Operator
    dereferenziert, so geht es: ((char *)&x)[1];



  • Ich würde mal sagen die 1 steht nicht so drin: 0x10000000 sondern eher so: 0x01000000 beim zweiten system. Das 0x00000001 bleibt gleich.

    @sirlant
    Was machst du mit deinem [1] wenn es sich um ein 16Bit-System handelt?

    @c-guest
    Um Probleme zu vermeiden bei dem ganzen, würde ich den Typ von x auf unsigned short ändern (also eine vorzeichenlose 2-Byte-Zahl) und beim Rückgabetyp reicht auch ein char, da du ja eh nur 0 oder 1 zurückbekommst. Außerdem ist dann eines der Warnings weg :).



  • Bei nem 16Bit System würde es doch auch gehen, ist ja vom char pointer 1byte
    weiter, also die Bits 9-16. Aber darum ging es doch gar nicht, ich wollte es
    dem Frager nur erklären weshalb das so funktioniert 🙂

    Und AJ wieso sollte es so drin stehen, 0x01000000? Für mich wäre das keine 1dez sondern
    eine 2dez?



  • SirLant schrieb:

    Und AJ wieso sollte es so drin stehen, 0x01000000? Für mich wäre das keine 1dez sondern
    eine 2dez?

    Little und Big Endian bezieht sich nur auf die Reihenfolge der Bytes innerhalb eines Wortes. Die Reihenfolge der Bits innerhalb eines Bytes ist vollkommen irrelevant.



  • und wenn die sich die bit reihenfolge auch umdrehen würde, wars nicht 0x10000000 sondern 0x80000000 also ist 0x10000000 völlig daneben 🤡 :p



  • SirLant schrieb:

    Bei nem 16Bit System würde es doch auch gehen, ist ja vom char pointer 1byte
    weiter, also die Bits 9-16. Aber darum ging es doch gar nicht, ich wollte es
    dem Frager nur erklären weshalb das so funktioniert 🙂

    Ok ein Beispiel mit 16Bit:
    In einem 16Bit-int steht 1 (also 0x0001 -> 1. Byte 0x00, zweites 0x01 ; big endian). Nach deinem Code ((char *)&x)[1] würde also hier auf das zweite Byte zugegriffen (da &x auf das erste Byte zeigt und mit [1] auf das zweite zugegriffen wird). Ergebnis wäre also 0x01 => 1. Wie hieß nochmal die Funktion? IS_LITTLE_ENDIAN! Da wir aber wissen, dass es eigentlich big endian ist, liefert die Funktion also das falsche Ergebnis!

    Verständlicher?

    Genauso problematisch ist es bei 32Bit und 64Bit Systemen. Darum hab ich auch vorgeschlagen anstatt int (was ja durch die System unterschiedlich groß ist) unsigned short (was immer nur zwei Byte groß ist und nicht auch noch die Minusbehandlung mit reinbringt) zu verwenden.

    Und AJ wieso sollte es so drin stehen, 0x01000000? Für mich wäre das keine 1dez sondern
    eine 2dez?

    Das wurde dir ja schon beantwortet. 🙂



  • @AJ das [1] sollte ihm doch nur erklären, dass er über den char-zeiger auf jedes
    byte des Integers zugreifen kann, es wird oben ja auf das erste zugegriffen.

    Achso jetzt verstehe ich 🙂



  • ja danke, habs verstanden 👍


Anmelden zum Antworten