Visual Studio 2015 - Compilerwarnung (Stufe 2) C4146

8

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%
  • Hat jemand dieses Problem mit dem Visual Studio 2015-Compiler gesehen?
  • Wie definiert es die Datentypen?
  • Wie wird der Bereich überprüft?
  • Warum scheint es die "unterschriebene" Aufgabe zu ignorieren?

Danke

    
Ninjawil 22.01.2016, 10:53
quelle

2 Antworten

6

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%     
Humam Helfawi 22.01.2016, 11:04
quelle
9

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 Ссылка

    
Bathsheba 22.01.2016 11:14
quelle