(gelöst) 32 und 64 Bits, ints und enums
Verfasst: 10.10.2009, 22:25
Hi,
Ich stehe gerade auf dem Schlauch. Ich konvertiere eine 32-Bit-Ganzzahl zu einer 64-Bit-Ganzzahl und umgekehrt. Die oberen 32 Bits sind mir dabei wumpe. Der Clou ist, dass die Zahl bei der Konvertierung zu 32 Bits durch XOR „gesalzen“ und bei der Rückkonvertierung zu 64 Bits wieder „entsalzt“ wird – und der Wert, mit dem das geschieht, ist ein enum. Und das ist dann auch der Punkt, an dem ich irgendwie die Orientierung verliere …:Dieser Code kracht, und das nicht erst bei der Ausführung:Nun verstehe ich nicht: Warum wird 0xEF56F3C9 beim Cast zu unsigned long abgeschnitten? Und warum sogar beim Cast zu unsigned long long?!? Salt kann doch unmöglich eine signed long sein, dann hätte sich der Compiler schon bei der Initialisierung mit Constant-out-of-Range beschwert…?
Gruß, Ky
P.S.: Das Ganze spielt sich in VS 2008 im x64-Modus ab.
Ich stehe gerade auf dem Schlauch. Ich konvertiere eine 32-Bit-Ganzzahl zu einer 64-Bit-Ganzzahl und umgekehrt. Die oberen 32 Bits sind mir dabei wumpe. Der Clou ist, dass die Zahl bei der Konvertierung zu 32 Bits durch XOR „gesalzen“ und bei der Rückkonvertierung zu 64 Bits wieder „entsalzt“ wird – und der Wert, mit dem das geschieht, ist ein enum. Und das ist dann auch der Punkt, an dem ich irgendwie die Orientierung verliere …:
Code: Alles auswählen
enum { Salt = 0xEF56F3C9 };
unsigned long _64to32(unsigned long long p_) {
return static_cast<unsigned long>(p_ ^ Salt);
}
unsigned long long _32to64(unsigned long p_) {
return static_cast<unsigned long long>(p_) ^ static_cast<unsigned long long>(Salt);
}
Code: Alles auswählen
(_64to32) warning C4310: cast truncates constant value
(_32to64) warning C4309: 'static_cast' : truncation of constant value
Gruß, Ky
P.S.: Das Ganze spielt sich in VS 2008 im x64-Modus ab.