2016-04-17 14 views
3

uint64_t x(1 << 35) gibt den Ausgang als 0 mit einer Warnung. Was wäre am besten geeignet, um solche großen Werte zu initialisieren?Wie man Uint64_t in C++ initialisiert 11

+0

Verwenden Sie ein Literal des richtigen Typs, der Ausdruck '1ULL << 35 'wird nicht überlaufen, weil die linke Seite ein ausreichend großer Typ ist –

+2

Wie wäre es' (static_cast (1) << 35) '? –

+1

In C++ 11 und später können auch [neue Literale für die Typen in ''] (https://stackoverflow.com/questions/36406333/fixed-width-integer-literals-in-c) definiert werden, die Sie können verwenden, um solche Probleme zu vermeiden. – mceo

Antwort

9

Es ist, weil 1 << 35 eine Operation ist, die int verwendet. Wenn Sie 64-Bit-Typen verwenden möchten, verwenden Sie 1ULL << 35, um sicherzustellen, dass es sich um eine Operation mit unsigned long long handelt (die garantiert mindestens 64 Bit umfasst).

2

Das Problem, das Sie haben, ist, dass die Kompilierzeit konstanten Ausdruck auszuwerten 1 < < 35 mit Int-Typen durchgeführt wird. Es ist wahrscheinlich, dass Sie diesen Typ überlaufen und das Verhalten ist nicht definiert!

Die einfachste Lösung ist die Verwendung von 1ULL < < 35. Ein vorzeichenloses langes langes Literal muss mindestens 64 Bit lang sein.

4
auto x = std::uint64_t(1) << 35; 
1
uint64_t x = 1000000000ull; 

Die ull markiert den Wert als unsigned long long

int64_t y = 1000000000ll; 

Das gleiche mit einem normalen lange lange.

uint64_t x2 = (1ull << 35ull); 

einfach ull am Ende Ihrer Nummer hinzuzufügen.

Verwandte Themen