"Eingrenzung der Konvertierung von 'int' nach 'char' innerhalb von {}" für zulässige Werte beim Kompilieren

9

Ich habe ein C ++ - Projekt, das ich sowohl mit g++ auf meinem Rechner kompiliere (kompiliere zu "host") als auch mit einem ARM-Prozessor über einen Cross-Compiler (in meinem Fall arm-cortex_a8-linux-gnueabi-g++ ). Ich bin dabei, in C ++ 0x / 11 Standart zu konvertieren, und es gibt einen Fehler, den ich bekomme, wenn ich Initialisierungsliste kompiliere, die ich im folgenden Schnipsel reproduzieren konnte:

%Vor%

Dieses Programm ist anscheinend korrekt, da -108 ein zulässiger Wert für char ist. Das Kompilieren mit g++ führt zu keinem Fehler mit der folgenden Befehlszeile:

%Vor%

Allerdings, wenn ich mit dem Cross-Compiler kompiliere, so:

%Vor%

Ich erhalte den folgenden Fehler:

%Vor%

Da der Wert legal ist, scheint dies ein Fehler zu sein. Kannst du erklären, warum ich diesen Fehler bekomme und was zu tun ist, um ihn zu lösen?

Bearbeiten : Beachten Sie, dass die Verwendung positiver Werte (z. B. 108 ) zulässig ist und nicht zu einem Fehler bei beiden Compilern führt.

    
Andy Thomas 26.07.2015, 08:16
quelle

3 Antworten

15

Wenn Sie eine Variable als char deklarieren, ist die Implementierung abhängig davon, ob sie signiert oder unsigniert ist. Wenn Sie in der Lage sein müssen, negative Werte zu speichern, sollten Sie sie explizit als signed deklarieren, anstatt sich auf den implementierungsdefinierten Standardwert zu verlassen.

%Vor%     
Barmar 26.07.2015, 08:29
quelle
9
  

Da der Wert legal ist

Woher weißt du das? char s signedness ist eine Implementierung definiert. Und wenn es nicht signiert ist, ist Ihr Code schlecht durch Verengung - §8.5.4 / 7:

  

Eine einschränkende Umwandlung ist eine implizite Umwandlung
[...]
(7.4) -    von einem Integer-Typ [...] zu einem Integer-Typ   das kann nicht alle Werte des Originaltyps darstellen, außer   wobei die Quelle ein konstanter Ausdruck ist, dessen Wert nach den Integral-Promotions in den Zieltyp passt.

§8.5.1 / 2:

  

Wenn die initializerklausel ein Ausdruck ist und eine Konvertierungskonvertierung (8.5.4) erforderlich ist, um den Ausdruck zu konvertieren, ist das Programm schlecht gebildet.

Wenn Sie jedoch eine signierte char benötigen, verwenden Sie signed char .

%Vor%

... wird garantiert funktionieren.

    
Columbo 26.07.2015 08:27
quelle
-1

Das sollte noch besser sein:

%Vor%

Weil in Klammern der Wert standardmäßig als int behandelt werden kann.

    
bibi 09.08.2016 13:11
quelle

Tags und Links