@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 zu int (bzw. wenn nötig unsigned 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 Typ short hast, dann ist der Wert des Ausdrucks x vom Typ short, aber die Werte von -x, +x, x-0 und x+0 sind alle vom Typ int.
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.