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
3
A
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
- 1. Initialisiert C++ 11 initialisierte Elementfelder neu?
- 2. Wie initialisiert man einen String in C++?
- 3. Wie initialisiert man eine Objektreferenz in C++?
- 4. Gusshohlraum Zeiger auf uint64_t Array in C
- 5. Wie aktiviert man C++ 11 in CLion?
- 6. Wie aktiviert man C++ 11 in Kdevelop
- 7. Wie implementiert man CAS in C++ 11
- 8. Wie initialisiert man ein mehrdimensionales Char-Array in C?
- 9. Wie initialisiert man eine Liste der Werte von std :: vector in C++ 11?
- 10. Wie -std-C++ 11 in Eclipse C++
- 11. Wie initialisiert man einen Vektor in einer Struktur in C++
- 12. Wie initialisiert man struct?
- 13. Wie initialisiert man mit mehreren Rückgabewerten in C++ (0x)
- 14. Wie initialisiert man einen Zeiger auf eine Struktur in C?
- 15. Wie initialisiert man ein unique_ptr
- 16. Wie verschachtelte Strukturen in C++ initialisiert werden?
- 17. Standardinitialisierung von Klassendatenmembern in C++ 11
- 18. Wie erstellt man einen shared_lock oder upgrade_lock in C++ 11?
- 19. Wie man jeden Thread seinen eigenen RNG in C++ 11
- 20. Wie berechnet man Strukturauffüllung in C++ 11 während der Kompilierzeit?
- 21. Wie definiert man starke ID-Typen in C++ 11?
- 22. Kapazität eines uint64_t?
- 23. Wie initialisiert man mehrere paintComponents?
- 24. C# Wie WebService initialisiert wird
- 25. Python und C++ 11 für swig: wie aktivieren C++ 11
- 26. intrusive_ptr in C++ 11
- 27. C++ 11 Dateisystem (VS2012)
- 28. Segmentierungsfehler: sekundäre Sortierung in SET C++ 11
- 29. Wie initialisiert man einen CKAsset?
- 30. Wie man Komponente neu initialisiert?
Verwenden Sie ein Literal des richtigen Typs, der Ausdruck '1ULL << 35 'wird nicht überlaufen, weil die linke Seite ein ausreichend großer Typ ist –
Wie wäre es' (static_cast (1) << 35) '? –
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