Stilfrage zum arbeiten mit 64Bit Zahlen unter 32Bit
-
Hallo. (32-Bit)-Windows gibt die Dateigröße als zwei Long-Variablen an. Welche Methode würdet ihr wählen, um diese in long long umzuwandeln?
//"Bit gefrickel" unsigned long long get_size() const { return (static_cast<unsigned long long>(wfd.nFileSizeLow) & (static_cast<unsigned long long>(wfd.nFileSizeHigh)<<32u)); } //Das Selbe mit Addition unsigned long long get_size() const { return (static_cast<unsigned long long>(wfd.nFileSizeLow) + (static_cast<unsigned long long>(wfd.nFileSizeHigh)<<32u)); } //über pointer unsigned long long get_size() const { return *(reinterpret_cast<const unsigned long long*>(&wfd.nFileSizeLow); } //über memcpy unsigned long long get_size() const { unsigned long long tmp; memcpy(tmp, wfd.nFileSizeLow, sizeof(unsigned long long); return tmp; }
-
edit: im ersten Fall muss es natürlich ODER statt UND sein!
-
Den 2. Fall.
Ich würde aber ein typedef benutzen, ala
typedef unsigned long long size64_t;
-
Ich hab's nichtmal ausgelagert.
UInt64 filesize=(UInt64(wfd.nFileSizeHigh)<<32)|wfd.nFileSizeLow;
-
In der MSDN wird diese Methode vorgeschlagen
UInt64 filesize=((UInt64)nFileSizeHigh * ((UInt64)MAXDWORD+1)) + (UInt64)nFileSizeLow.Was haltet ihr davon?
-
Stily schrieb:
In der MSDN wird diese Methode vorgeschlagen
UInt64 filesize=((UInt64)nFileSizeHigh * ((UInt64)MAXDWORD+1)) + (UInt64)nFileSizeLow.Was haltet ihr davon?
Das mag ich auch. Der Compiler wird schon bistshift und bitwise or draus machen. Allerdings ziehe ich die functional stype casts den c-cats vor, da hab ich irgendwie schneller Übersicht, was genau gecastst wird.
UInt64 filesize=(UInt64(nFileSizeHigh) * (UInt64(MAXDWORD)+1)) + UInt64(nFileSizeLow).
-
@volkard: die Function-Style-Casts sind gleichbedeutend mit C-Style Casts. D.h. die können auch reinterpretieren (und const casten) - was ich nicht so toll finde. Noch schlimmer: da sie wie ein Ctor aussehen, wissen das viele Leute nicht, und vermuten, fälschlicherweise dass die Function-Style-Casts "sicher" sind (wie static_cast es wäre).
Warum nicht gleich static_cast?
@Stily:
Die MSDN Variante ist IMO die beste, weil am besten/einfachsten verständlich. Und wie volkard schon sagte, wird jeder vernünftige Compiler im Release-Build nen Shift aus der Multiplikation machen, womit die MSDN Variante auch gleich schnell wie alles andere sein dürfte.
-
hustbaer schrieb:
@volkard: die Function-Style-Casts sind gleichbedeutend mit C-Style Casts. D.h. die können auch reinterpretieren (und const casten) - was ich nicht so toll finde.
Ist in diesem Fall (und vielen anderen) völlig irrelevant, fürchte ich.
hustbaer schrieb:
Noch schlimmer: da sie wie ein Ctor aussehen, wissen das viele Leute nicht, und vermuten, fälschlicherweise dass die Function-Style-Casts "sicher" sind (wie static_cast es wäre).
Naja, Du wirst einsehen, daß ich aus rein praktischen Erwägungen diesen cast nicht so oft mit Zeigern und Referenzen machen.
i=int*(p);//comiler lachtDieser Cast aber allein mit Objekten (nicht Zeigern/Referenzen) ausgeführt, verliert schon die Gefährlichkeit. Auch passiert er nicht bei Zuweisungszielen
char(i)=3;//compiler lachthustbaer schrieb:
Warum nicht gleich static_cast?
Weil die Angst völlig übertrieben ist und weil ich mir ungefährlichen Code ungern mit Gefahrenschildern vollspamme.
-
volkard, schön langsam könntest du mir ruhig mal etwas mehr zutrauen. was du schreibst ist mir schon klar. was du vielleicht übersehen hast:
int i = 2; int* p = &i; size_t j = size_t(p); // compiler schweigt, programmierer weint.genauso wirst du vermutlich wissen, dass es in C++ sowas wie typedefs gibt.
PULONG p2 = PULONG(123); // compiler schweigt weiterhin, nichtmal ne warning...Weil die Angst völlig übertrieben ist und weil ich mir ungefährlichen Code ungern mit Gefahrenschildern vollspamme.
es geht ja gerade darum, sich garnicht erst anzugewöhnen, bestimmte dinge zu schreiben, auch wenn man denkt es sei ungefährlich.
gerüchteweise soll es nämlich vorkommen, dass menschen fehler machen. und dann denken die - gerüchteweise - auch mal etwas sei ungefährlich, was es garnicht ist.
-> der compiler schweigt, der programmierer weintvollkommen unnötigerweise.
daher schreibe ich grundsätzlich nirgends mehr c-style casts, und auch keine function-style casts. die 13 zeichen mehr platz für einen static_cast sind doch wirklich kein problem.