C++ : integer-Konstante zu groß für seinen Typ
Muss ich bruteforce ein Jahr für eine übung. Der compiler halten, werfen diese Fehlermeldung:
bruteforceJS12.cpp:8:28: Warnung: integer-Konstante zu groß für seinen Typ [standardmäßig aktiviert]
Mein code ist:
#include <iostream>
using namespace std;
int main(){
unsigned long long year(0);
unsigned long long result(318338237039211050000);
unsigned long long pass(1337);
while (pass != result)
{
for (unsigned long long i = 1; i<= year; i++)
{
pass += year * i * year;
}
cout << "pass not cracked with year = " << year << endl;
++year;
}
cout << "pass cracked with year = " << year << endl;
}
Hinweis, dass ich bereits versucht mit unsigned long long result(318338237039211050000ULL);
Ich bin mit gcc version 4.8.1
EDIT:
Hier ist die korrigierte version mit InfInt Bibliothek http://code.google.com/p/infint/
#include <iostream>
#include "InfInt.h"
using namespace std;
int main(){
InfInt year = "113";
InfInt result = "318338237039211050000";
InfInt pass= "1337";
while (pass != result)
{
for (InfInt i = 1; i<= year; i++)
{
pass += year * i * year;
}
cout << "year = " << year << " pass = " << pass << endl;
++year;
}
cout << "pass cracked with year = " << year << endl;
}
- Sie sollten verwenden Sie die ASCII-Repräsentation.
- Scheitert es mit
unsigned long long result = 318338237039211050000ULL;
? Ist es vielleicht einfach, dass Sie es nicht mag, der Initialisierungs-Methode? - Wörtliche Suffixe sind nicht für diesen Zweck. Ein integer-literal hat bereits einen Typ, der darstellen kann, wenn eine solche vorhanden ist.
- ` Warnung: integer-Konstante zu groß für Ihren Typ " ... Es kann nicht gespeichert werden, in einen unsigned long long-Variablen. Es ist alle.
- Verwenden
std::numeric_limits<unsigned long long>::max()
um zu sehen, was Ihr problem ist. 318338237039211050000 deutlich größer ist, als 18446744073709551615. int128_t
sollte groß genug sein, wenn Sie Zugang zu diesem Typ. 69 erforderlichen bits- Zu viele dieser Kommentare Aussehen Antworten - warum nicht post eine Antwort?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen schnellen Weg, um herauszufinden, die numerischen Grenzen auf Ihrem system zu verwenden std::numeric_limits. Die Ausgabe auf meinem system, wenn ich den folgenden code ausführen:
ist:
sehen wir den max-Wert ist definitiv kleiner als Ihre wörtliche Wert:
Damit Ihre integer-literal ist einfach zu groß für unsigned long long geben.
Dein problem ist einfach, dass
318338237039211050000ULL
ist außerhalb des Bereichs.Vorausgesetzt wird ein 64-bit-Typ, ein 64-bit-Wert ist gut für log10( 264-1) Dezimalstellen (d.h. alle 19-stellige Werte und einige niedrigere 20-stellige Werte),
318338237039211050000ull
hat 21 Ziffern. 264-1 (18446744073709551615ull
) ist das maximum.Den Wert 318338237039211050000 erfordert mindestens log10(318338237039211050000)/log10(2) bits. Das ist 69 bits.
int
,long int
,long long int
vertreten kann, Ihren Wert. (Die Liste war anders in früheren Versionen des Standards.) Siehe Abschnitt 2.14.2 [lex.Symbol] im C++ - standard.int
,long int
oderunsigned long int
. In C++98 war esint
oderlong int
. Pre-standard-Compiler haben könnte erforderlichint
.long long
war nicht ein standard-Typ in C oder C++ erst später standards. Ich bin ein Entwickler von embedded Systemen und, sofern mit GCC, C++11 und teilweise sogar C99-Compiler sind nicht unbedingt gegeben. In einigen Fällen sind diese mehr Nischen-Architektur-spezifischen Compiler generieren engere code als GCC so weiter verwendet werden. Also ich bleibe bei der Gewohnheit, weil Portabilität zwischen Compilern auf verschiedenen compliance-Level ist wichtig, in meinem Bereich arbeiten. Die Frage angegebenen GCC 4.8.1, es ist klar, dass die ULL-suffix ist wie Sie sagen, nicht erforderlich.