Ich habe die folgende Zeile in meinem Code
%Vor%was den Fehler erzeugt:
C4146 unärer Minus-Operator, der auf vorzeichenlosen Typ angewendet wurde, Ergebnis immer noch vorzeichenlos
aber dies ist immer noch mit dem Datenbereich des ganzzahligen Vorzeichentyps:
__ int32 signiert, signiert int, int -2.147.483.648 bis 2.147.483.647
Die seltsamen Dinge weisen es als signed long zu, geben denselben Fehler, d. h.
%Vor%Die folgenden Änderungen kompilieren OK:
%Vor%Danke
Da es sich um einen Compiler-Fehler handelt, ist diese Antwort spezifisch für MSVC und falsch von der iso-C ++ - Perspektive. Für die korrekte und standardmäßige Antwort siehe @Bathsheba Antwort. (Ich ermutige das OP, die richtige Antwort anstelle dieser Antwort für zukünftige Leser zu akzeptieren).
Von MSDN :
Die Nummer 2147483648 wird ausgewertet. Weil es größer ist als die maximaler ganzzahliger Wert von 2147483647, der Typ von 2147483648 ist nicht int, aber unsigned int.
Mit anderen Worten, der Compiler behandelt -2147483648 als -
und 2147483648
nicht als -2147483648
. Daher wird der 2147483648
-Teil als unsigned int
betrachtet, da er größer ist als int
. und dann wendet der Compiler den Operator -
an, der zu dieser Warnung führt.
Lösung:
%Vor%Dies ist ein Compilerfehler.
Als erstes zu beachten: -2147483648 ist nicht ein Literal. In C ++ gibt es kein negatives Literal.
-2147483648 ist ein auswertbarer Ausdruck für die Kompilierzeit, bestehend aus 2147483648 und dem unären Minus-Operator.
Wenn MSVC auf Windows x64 abzielt (wobei int und long beide 32 Bit sind), sollte 2147483648 ein long long int
sein, und daher auch -2147483648. Mein Verständnis ist, dass der Standard auf einem signierten Typ besteht es sei denn Sie verwenden ein hexadezimales oder oktales Literal.
Die Eingrenzungskonvertierung in signed int
ist in diesem Fall gut definiert, da Sie eine Plattform mit einem 32-Bit-Zweierkomplement int
-Typ anvisieren.
Weitere Referenz: siehe Ссылка
Tags und Links c++ visual-studio language-lawyer compiler-warnings visual-studio-2015