GCC warnt nicht, wenn == op mit einer signierten Variablen und einem unsignierten Literal verwendet wird

8

Warum warnt GCC nur für die Situationen 1 und 3 und nicht 2 im folgenden Code?

Ich kompiliere mit -Wall und -g Flags.

%Vor%     
nisah 03.12.2010, 15:45
quelle

3 Antworten

4

Ссылка :

-Wowandlungsabschnitt:

  

Warnen Sie nicht vor expliziten Umsetzungen wie    abs ((int) x) und ui = (unsigned) -1 , oder wenn der Wert nicht durch die Konvertierung geändert wird, wie in abs (2.0) .

Da 2U literal ist, gcc weiß das:

  • wenn si < 0 , dann (unsigned) si >= 2^31 , also s1 != 2U .
  • wenn si > 0 , dann (unsigned) si hat den gleichen Wert wie si , also (unsigned) si == 2U wenn und nur wenn si == 2 .

Zusammenfassend ist der Vergleich des signierten si mit dem Literal 2U mit dem Vergleich von si mit 2 identisch, dh das Ergebnis von si == 2U wird nicht durch die Konvertierung von si in% co_de geändert %.

Wenn Sie mit 2 ^ 32-1 (4294967295U) vergleichen, dem größten in 32-Bit unsigned int, der in unsigned nicht darstellbar ist, dann könnte int gleich sein, selbst wenn si selbst ist negativ, dies ist möglicherweise nicht das, was Sie wollten, daher wird eine Warnung mit si -Option generiert.

    
Ryan Li 03.12.2010, 16:18
quelle
1

Möglicherweise, weil es keine Mehrdeutigkeit in einem Gleichheitsvergleich mit Konstanten in dem Bereich gibt, in dem sich vorzeichenbehaftete und vorzeichenlose Versionen des Typs überlappen.

Wenn ich es zu

ändere

if (si == 2147483648U ) { printf("xxxx"); }

Ich bekomme eine Warnung

(Eigentlich musste ich -Wextra hinzufügen, bevor ich die Warnungen erhalten habe, die Sie gemeldet haben)

    
Chris Stratton 03.12.2010 16:21
quelle
0

Chris, danke für deine Antwort. Ich denke, es führt zur Ursache. Mein ursprünglicher Gedanke war, dass das U-Suffix dazu führen würde, dass dieses Literal auf einen vorzeichenlosen Typ hochgestuft wird, aber ich denke, dass es nur auf einen vorzeichenlosen Typ hochgestuft wird, wenn die Zahl größer ist als INT_MAX_32, das & gt; 2147483647.

    
nisah 03.12.2010 16:39
quelle

Tags und Links