Warnung: diese decimal-Konstante ohne Vorzeichen ist nur in ISO-C90
Stück code :
long rangeVar = 0;
rangeVar = atol(p_value);
if (rangeVar >= -2147483648 && rangeVar <= 2147483647)
Beim kompilieren bekomme ich:
Achtung: diese decimal-Konstante ohne Vorzeichen ist nur in ISO-C90
Vielen Dank im Voraus
InformationsquelleAutor der Frage user1227514 | 2012-03-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Regeln für die Typen decimal integer-Konstanten geändert, zwischen 1990 und 1999 Ausgaben des ISO-C-standard.
In den 1990-er version, eine unsuffixed dezimale integer-Konstante mit dem Typ ist der erste der
int
long int
oderunsigned long int
dessen Wert dargestellt werden kann. (C90 hatte keinelong long
oderunsigned long long
- Typ).In den Jahren 1999 und 2011-Versionen seiner Art ist einer der
int
long int
long long int
; es ist nie jeder Datentyp ohne Vorzeichen.Den Typ einer bestimmten Konstanten (wie
2147483648
) variieren je nach den Bereichen von integer-Typen für den compiler, den Sie verwenden. Wenn dein compiler istlong
Art passiert zu sein, 32 bit, dann2147483648
Typunsigned long
wenn Ihr compiler verwendet C90 Regeln, oder der Typlong long
wenn es verwendet C11 Regeln (long long
ist garantiert mindestens 64 bits). Der compiler warnt Sie darüber.Können Sie Suffixe hinzufügen, um die Typisierung von Konstanten ist-aber es gibt kein suffix für nur unterzeichnet
int
. Sie können hinzufügenU
fürunsigned int
L
fürlong
UL
für unsigned long, und so weiter.Es ist wichtig zu beachten, dass
-2147483648
ist nicht eine integer-Konstante; vielmehr2147483648
selbst ist eine integer-Konstante, und-2147483648
ist ein Ausdruck, der wendet eine unäre minus-operator an, dass Konstante. Unter C90 Regeln, wenn die Konstante vom Typunsigned long
das ist eine unsigned unäre minus, die nach den Regeln der unsigned-Arithmetik ergibt den Wert2147483648
. Unter C99 oder C11 Regeln2147483648
ist wahrscheinlich der Typ (signed)long long
und Sie zu negieren Erträge-2147483648
auch der Typlong long
.Werden Sie manchmal sehen-code, der verwendet
(-2147483647 - 1)
um dieses problem zu vermeiden; unter einem 32-bit -int
2147483647
ist der Typint
und das Ergebnis des Ausdrucks ergibt sich die erwarteteint
Wert ohne überlauf.Natürlich, wenn Ihr compiler hat verschiedene Größen für die integer-Typen, so kann noch mehr kompliziert.
InformationsquelleAutor der Antwort Keith Thompson
Ja, das ist eine Sache, die nicht sehr gut verarbeitet, die durch den compiler. Das problem ist, dass während der Kompilierung, das ist die Zahl 2147483648, die negiert, und 2147483648 ist außerhalb des zulässigen Bereichs für eine Ganzzahl. Auch wenn -2147483648 wäre nicht!
Sowieso, um loszuwerden die Warnung, kann man die Konstante in einer 64 bit-Zahl durch schreiben
-2147483648LL
.Das ist übertrieben, obwohl, so der bevorzugte Weg wäre, um
INT_MIN
für die Konstante ein. Aber dann werden Sie brauchen, um<limits.h>
.InformationsquelleAutor der Antwort Mr Lister
Ja, 2147483648 ist nicht ein Gültiger positiver Wert, denn es ist aus der Reihe für 2-Komplement 32-bit-Maschinen, so dass Sie nur versuchen, Sie zu warnen, dass auf einige Compiler dies kann nicht geben Sie den Wert, den Sie wollen, wenn Sie nicht behandeln, die negation in einer modernen Art und Weise.
Glaube ich, es ist Wert das hinzufügen einer anderen Antwort darauf hin, dass wenn man sich die meisten Grenzen.h-Implementierungen, werden Sie sehen, dass Sie bekommen, um dieses mit
(-2147483647 - 1)
.InformationsquelleAutor der Antwort Peter M