long: 32 Bit vs 64 Bit



  • Hallo!

    Ich habe folgende Funktion, die einen long in eine Datei schreibt:

    #define SIZE_LONG 2
    char dst[8];

    void writeLong(long inVal){     
       swapBytes(dst, &inVal, SIZE_LONG);
       fwrite(dst, SIZE_LONG, 1, fileDesc);
    }
    

    Wenn ich das Programm unter 32 kompiliere klappt alles, da long 2 Byte lang ist und er 2 Byte in die Datei schreibt.

    Nun soll das Programm aber auch in 64 Bit kompiliert werden und exakt den selben Output haben wie die 32 Bit Version.
    Nehmen wir an unter 64 Bit ist der long laenger, also 4 Byte. Ich schreibe aber nur 2 Bytes dieses 4 Byte langen long in die Datei. Passt das? Sind das die richtigen Bytes oder kann das sein, dass das schief geht?



  • Das ist ganz klar C. Ein Moderator wird dich dorthin verschieben.



  • Auf welchem System ist denn ein long 2 Byte groß? Laut ANSI-Standard ist long mindestens 4 Byte, da hängt es dann von der Byte-Order des Rechners ab, ob der Code das macht, was du von ihm erwartest.



  • Dieser Thread wurde von Moderator/in CStoll aus dem Forum C++ (auch C++0x) in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • für C99 geht:

    uint32_t x=0x11223344;
    fwrite(&x,sizeof x,1,file)
    ...
    fread(&x,sizeof x,1,file)
    

    Sollte für 32+64Bit funktionieren.



  • CStoll schrieb:

    Auf welchem System ist denn ein long 2 Byte groß? Laut ANSI-Standard ist long mindestens 4 Byte, da hängt es dann von der Byte-Order des Rechners ab, ob der Code das macht, was du von ihm erwartest.

    Sorry, hab mich verschrieben. Long ist in der 32 Bit Version natürlich 4 lang und auf dem 64 Bit System eventuell 8.

    Kannst du das mit der Byte-Order etwas genauer erläutern? Also wie schreibt fwrite() und was muss ich machen, damit es immer klappt?
    Geschrieben wird übrigens aus einem char array dst, und wie in das rein kopiert wird, wird bereits Abhängig von der Endianess gemacht (swapBytes).
    Die Frage ist nur was passiert, wenn ich in der 64 Bit Version von dem 8 byte langen long nur 4 byte schreibe...



  • Andreas771 schrieb:

    Kannst du das mit der Byte-Order etwas genauer erläutern?

    Mit der Byte-Order meinte ich u.a. die Endianess - bei vier Byte gibt es da noch mehr Möglichkeiten, die zu einer Zahl zusammenzufassen.

    Also wie schreibt fwrite() und was muss ich machen, damit es immer klappt?

    fwrite schreibt die Bytes in der Reihenfolge, in der sie im Speicher stehen - solange du die Datei im selben System weiterverarbeitest, sollte das egal sein. Wenn du die Daten zwischen verschiedenen Systemen austauschen willst, mußt du sie selber in eine definierte Reihenfolge bringen.



  • Benutzt C/C++ intern eigentlich immer die selbe Endianess oder immer die Endianess des benutzten PCs?



  • Das wird im Standard nicht festgelegt, also kann jeder Compiler selber entscheiden, wie er die Werte darstellt (es ist noch nicht einmal festgelegt, daß int in Zweierkomplement rechnen muß). Und der Compiler wird normalerweise die Darstellung verwenden, mit der der drunterliegende Prozessor am besten umgehen kann.



  • Ok. Das heißt, dass vermutlich dieser Code:

    int i = 0xAABBCCDD;
    char* c = (char*)&i;
    printf("%i", *c);
    

    Auf einer Little Endian Maschine DD ausgibt und auf einer Big Endian Maschine AA, oder?

    Mein Problem ist also gelöst, wenn ich überall int32_t benutze?



  • Nein.



  • Was nein?



  • Andreas771 schrieb:

    Mein Problem ist also gelöst, wenn ich überall int32_t benutze?

    Wutz schrieb:

    Nein.

    Dein Problem ist nicht gelöst wenn du überall int32_t benutzt.



  • Fragenerklärer schrieb:

    Andreas771 schrieb:

    Mein Problem ist also gelöst, wenn ich überall int32_t benutze?

    Wutz schrieb:

    Nein.

    Dein Problem ist nicht gelöst wenn du überall int32_t benutzt.

    Wieso nicht? Wenn ich int32_t benutze, dann schreibe ich sowohl in 32 als auch 64 Bit Modus immer gleich viele Bytes? 😕



  • Wie schnell vergisst du eigentlich die vorigen Beiträge, z.B. zum Thema Byteorder, dass du solche Fragen stellst?





  • Wutz schrieb:

    Wie schnell vergisst du eigentlich die vorigen Beiträge, z.B. zum Thema Byteorder, dass du solche Fragen stellst?

    Ich habe doch bereits gesagt, dass ich mich um Endianess kuemmere. Was denkst du denn wieso ich vor fwrite eine Funktion namens swapBytes() aufrufe? 🙄

    Also nochmal: Wenn ich mich um die Endianess kuemmere, und immer int32_t benutze, dann sollte schreiben und lesen sowohl in 32 bit als auch 64 bit funktionieren, oder?



  • Andreas771 schrieb:

    Ich habe doch bereits gesagt, dass ich mich um Endianess kuemmere. Was denkst du denn wieso ich vor fwrite eine Funktion namens swapBytes() aufrufe? 🙄

    Weil du der Meinung bist, daß diese Funktion cool aussieht 🕶 Wir wissen nicht, was genau diese Funktion macht, aber wenn du nicht für jedes System eine eigene Version hast, wird es vermutlich irgendwo das falsche sein.


Anmelden zum Antworten