Ссылка :
-Wowandlungsabschnitt:
Warnen Sie nicht vor expliziten Umsetzungen wie
abs ((int) x)
undui = (unsigned) -1
, oder wenn der Wert nicht durch die Konvertierung geändert wird, wie inabs (2.0)
.
Da 2U
literal ist, gcc weiß das:
si < 0
, dann (unsigned) si >= 2^31
, also s1 != 2U
. 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.
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, 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.
Tags und Links gcc compiler-warnings casting