Overflow Warnung
-
Hallo,
ich bekomme eine Misra Warnung bei meiner Vorzeichen-Invertierung. Der Wert in "variable_SW" soll einfach negiert wieder drauf gespeichert werden.
Das ganze läuft auf einem 32Bit RISC Controller.
Kann jemand sagen, ob hier tatsächlich ein Fehler drin steckt? Ich verstehe die Meldung auch nicht ganz.typedef int16 SWORD; SWORD variable_SW; #define invertiere_vorzeichen(x) (-(sint16)(x)) variable_SW = invertiere_vorzeichen(variable_SW);
Meldung:
Cast on result of arithmetic computation may cause overflow: (SWORD)-(signed int)(sint16)variable_SWDIe Meldung beinhaltet 3 Typen:
-> int16 (SWORD)
-> signed int
-> sint16Ich hätte gedacht, alle haben die Größe: 2 Bytes, und Bereich: -32,768 ... +32,767
Sollte es nicht so sein?
-
@c_coder Was passiert bei -32768?
-
Ich hätte gedacht, alle haben die Größe: 2 Bytes, und Bereich: -32,768 ... +32,767
Der Typ
int
wird auf dieser Plattform höchstwahrscheinlich ein 32-bit-Typ sein.
-
das stimmt natürlich. Jede lokale Variable ist per standard hier ein 32 Bit Wert.
Aber warum nimmt er "signed int" als lokalen Typ an, obwohl ich es doch auf sint16 caste ?
Evtl. ist das Makro falsch - müsste ich es so schreiben:#define invertiere_vorzeichen(x) (sint16)(-(x))
?
-
@DirkB sagte in Overflow Warnung:
@c_coder Was passiert bei -32768?
Laut Simulation es ist dann auch -32768.
Weil eine Invertierung = +32768 wäre, was wiederum -32768 wegen dem Vorzeichen-Bit entspricht.
Was kann man also tun um die Meldung zu eliminieren?
-
@c_coder sagte in Overflow Warnung:
Aber warum nimmt er "signed int" als lokalen Typ an, obwohl ich es doch auf sint16 caste ?
Weil bei der Verwendung der eingebauten arithmetischen Operatoren (wie dem hier verwendeten unären Minus), erstmal "integral promotion" passiert. D.h. alles was formal kleiner als
int
ist, wird erstmal zuint
(bzw. wenn nötigunsigned int
) gemacht.Für C hab ich jetzt keinen Link parat, aber die entsprechende Regel für C++ kannst du hier nachlesen:
https://en.cppreference.com/w/cpp/language/implicit_conversion#Numeric_promotions
Die selbe Regel existiert AFAIK in sehr ähnlicher Form für C.D.h. wenn du eine Variable
x
vom Typshort
hast, dann ist der Wert des Ausdrucksx
vom Typshort
, aber die Werte von-x
,+x
,x-0
undx+0
sind alle vom Typint
.Was kann man also tun um die Meldung zu eliminieren?
Was du schon selbst vorgeschlagen hast sollte funktionieren:
#define invertiere_vorzeichen(x) (sint16)(-(x))
Allerdings frage ich mich was es bringt das hinter einem Makro zu verstecken. Aber das ist wieder ein anderes Thema.