long long int Initialisierung Warnungen
2 Fragen
Ersten, während
long long int num = 1000000000000;
funktioniert
long long int num = 4014109449;
gibt
warning: this decimal constant is unsigned only in ISO C90 [enabled by default]
Was bedeutet es ?
Zweitens
long long int num = 1000000*1000000;
gibt ein überlauf-Warnung
während
long long int num = 1000000000000;
ist ok,auch wenn Sie gleich sind.Wie kann ich es loswerden? Die Multiplikation ergibt einen Müll Wert
- Sie müssen wissen, die Arten von integer-literalen. Siehe stackoverflow.com/q/8108642/420683
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass der Wert
4014109449
ist einunsigned long int
im C90, sondern einlong long int
im C99, da es zu groß für eine 32-bit -long int
. Während1000000000000
ist zu groß für alle 32-bit-Typ, so wird automatisch einlong long int
. Die Warnung bezieht sich auf die Tatsache, dass das Verhalten unterscheidet sich zwischen C90 und C99.Die Lösung ist, um zu erzwingen Art Vereinbarung zwischen der wörtlichen und der Typ der variable, indem Sie einen entsprechenden Typ suffix. In diesem Fall:
verwenden oder einen type-cast:
Ebenso der Ausdruck
1000000 * 1000000
ist ein multiplizieren von zweiint
Typen und hat eineint
Ergebnis, sondern führt zu einem overflow - es gibt keine automatische Förderung zu einem größeren Typ fürint
Ausdrücken. Die Lösung wird wieder explizit über die Art der literalen:oder Sie können auch ein type-cast auf einem oder beiden Operanden.
int
Typen - das ist der bevorzugte Datentyp für alle Operationen. Die automatische type promotion Regeln sind etwas geheimnisvoll, ist es immer besser, die explizite Typ-Vereinbarung. Nur ein operand muss die größere Art aber zu zwingen, das Ergebnis der größeren type.long
,1000000000000
ist der Typunsigned long
(die Warnung könnte klarer werden darüber, es nutzt das "unsigned" als Adjektiv, nicht als Typ-Namen).unsigned long
. rohan013 sagt die Warnung ist für4014109449
, also ich bin unklar, was Sie versuchen, zu erklären. Aber deine Antwort ist klar.1000000000000
in meinem vorherigen Kommentar war ein copy-und-paste-Fehler, ich wollte sagen, dass4014109449
ist der Typunsigned long
.In C90, den Typ eines unsuffixed dezimale integer-Konstante (literal) ist der erste von
int
long int
unsigned long int
vertreten kann seinen Wert ohne überlauf.
In C99 und später, es ist das erste von
int
long int
long long int
vertreten kann, Ihren Wert.
Den Wert
4014109449
passiert zu sein, darstellbar als ein 32-bit - unsigned integer, aber nicht als 32-bit - unterzeichnet integer. Vorausgesetzt, Ihr system ist 32-bit -long
s, dass Konstante des Typsunsigned long int
im C90,long long int
in C99 und C11.Dass das, was die Warnung sagt Sie. Der Typ der Konstanten ändert sich, je nachdem, welche version der C-standard der compiler entspricht.
Beachten Sie, dass, unabhängig von seiner Art, den Wert von
4014109449
immer richtig sein, und in deiner Erklärung:dieser Wert wird immer korrekt in
long long
. Aber es würde sicherlich nicht Schaden (und wäre Stille die Warnung), um eineLL
suffix, um Sie ausdrücklich, dass Sie möchten, dass ein Wert vom Typlong long
:Als für dieses:
vorausgesetzt, Sie haben 32-bit -
int
s, die Konstante1000000
ist der Typint
, und das Ergebnis der Multiplikation zweierint
Werte ist auch der Typint
. In diesem Fall, die Multiplikation überlaufen wird. Wieder, Sie können das problem vermeiden, indem sichergestellt wird, dass die Konstanten sind vom Typlong long int
:(Beachten Sie, dass Sie kann Kleinbuchstaben
ll
, aber es ist eine schlechte Idee, da es schwierig sein kann zu unterscheiden, die Buchstabenl
von der Ziffer1
.)