Was bedeutet die Anweisung &0x7fffffff ?



  • Hallo,

    gegeben ist ein C++ 64 bit Konsolen Programm erstellt mit Visual Studio 2017 Version 15.8.0.

    Darin befindet sich folgende Funktion, die ich aus einem Quellcode übernommen habe:

    time_t Timestamp::to_time_t(void) {
        return (seconds - ((70ull * 365ull + 17ull) * 86400ull))&0x7fffffff;
    }
    

    "seconds" ist als unsigned int definiert. Das Suffix "ull" für unsigned long long int habe ich schon hinzugefügt, weil der Compiler sonst einen Überlauf beanstandet. Aber den Begriff &0x7fffffff verstehe ich nicht, bzw. was er bewirken soll? Ich habe den Eindruck das die Funktion auch ohne diesen Ausdruck funktioniert. Ist der Begriff auch für ein 64 bit Programme nötig?

    Grüße,
    mireiner



  • Das ist ein bitweises Und. Damit werden die ersten x Bit (rechne das selber aus) deines Ergebnisses auf 0 gesetzt.



  • Aus welchem Grund auch immer werden die Anzahl der Sekunden von 70 Jahren und 17 Tagen berechnet. Dies wird dann von den Sekunden abgezogen und mit einem bitweisen AND 0x7fffffff verknüpt (es werden also nur die unteren 31 Bit zurückgegeben).

    Edit: Ich habs jetzt: Differenz zwischen 1.1.1900 und 1.1. 1970.



  • Hallo Mechanics,

    von bit Operationen habe ich nicht die leiseste Ahnung. Hast Du eine Idee aus welchem Grund die ersten x Bits auf 0 gesetzt werden müssen?

    Die Funktion rechnet die Variable "seconds" um, die die verflossenen Sekunden seit dem 1.1.1970 um 0:00 UTC angibt. Ausgegeben wird dann die Variable time_t, die die verflossenen Sekunden seit dem 1.1.1900 um 0:00 UTC angibt. Im Grunde eine sehr simple Umrechnung.

    Mich stört nur der für mein Verstandnis komplizierte Begriff &0x7fffffff. Ob der wirklich nötig ist? Oder stellt er vielleicht nur sicher, dass genug Speicher für die Variable zur Verfügung steht und ist womöglich für ein 64 bit Programm überflüssig. Denn wie gesagt funktioniert die Funktion auch ohne diesen Begriff.



  • Btw., es ist sowieso keine gute Idee, die Differenzen als int32_t zu betrachten, Siehe auch year 2038 problem.



  • Hallo yahendrik,

    ich bin leider ein eher unerfahrener Hobby Programmierer. Da geht schnell etwas über meinen Horizont. So verstehe ich nicht warum int32_t für die Funktion relevant ist. Wie gesagt programmiere ich in 64 Bit. Sollte nicht der Compiler in Verbindung mit der Definition von time_t in der C++ Header Datei automatisch dafür sorgen, dass der Wertebereich bei 64 bit Programmen ausreichend ist für den Rückgabewert? Die Variable time_t ist ja an vielen Header Dateien defininiert u.a. in <ctime>.

    Ich programmiere übrigens für Windows 10 64 bit. Tritt denn da bei 64 bit Programmen das "Jahr 2038 Problem" überhaupt auf?

    Wie müsste denn diese kleine hier vorliegende Funktion umgeschrieben werden, damit es im Jahr 2038 zu keinen Problemen kommt? Für Hilfe wäre ich sehr dankbar.



  • @mireiner
    Was das jetzt für einen Sinn hat, weiß ich nicht (find ich auch nicht spannend genug, drüber nachzudenken). Bit Operationen an sich sind aber nicht kompliziert, das solltest du dir schon etwas genauer anschauen und dich damit vertraut machen, das wird dir öfter begegnen.
    Das ist kein "Begriff". Das sollte man auch nicht zusammenschreiben, zumindest, um das besser zu verstehen. Das ist der Operator "&" und der Wert "0x7fffffff".



  • Es ist nur eine Konvertierung zwischen zwei Zeitangaben. Einmal hast du die Sekunden seit 1900 (wohl 64 Bit alleine schon wegen der Postfixe) und dann seit 1970. Diese Funktion konvertiert die erste Zeitangabe in die zweite.

    Wenn seconds immer eine Angabe nach 1970 darstellt, könntest du mit `0xFFFFFFFF' verknüpfen. Das wird dann erst bei Zeitpunkten nach 2106 überlaufen -> hier.

    Ansonsten kannst du natürlich auch die Größe von seconds auf 64 Bit umstellen. Dann müsstest du aber schauen, wie dein time_t definiert ist

    Deinen Edit im ersten Post habe ich gerade erst gesehen...Es gilt evtl alles nur bedingt. Aber du kannst ja selber schauen, wie das Verhalten bei allen möglichen Überlaufen ist.



  • @yahendrik
    Da time_t in den Standard C++ Header Dateien definiert ist, hoffe ich mal, dass seine Definition sicher sein wird. Das Problem wird also die Definition von "seconds" als unsigned int sein. Dort könnte im Jahr 2038 ein Überlauf geschehen. Das werde ich mir dann einmal näher anschauen. Danke für den Hinweis.


Log in to reply