Forum: PC-Programmierung Warnung bei addition mit überflow in c


von Jens (Gast)


Lesenswert?

einen schönen tag,
ich habe ein verständnisproblem in c.
1
uint8_t temp = 0;
2
temp = 0xA5 + 0xBB;

als Ergebnis bekomme ich 0x60 (auch erwartet).

Allerdings bekomme ich eine Warunung:
warning: unsigned conversion from 'int' to 'uint8_t' {aka 'unsigned 
char'} changes value from '352' to '96' [-Woverflow]

Wenn ich es sogar explizit nochmal angebe:
1
temp = uint8_t(0xA5 + 0xBB);
bekomme ich sogar einen Fehler:
expected expression before 'uint8_t'

Wie bekomme ich denn die Warnung weg?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jens schrieb:

> Wenn ich es sogar explizit nochmal angebe:
>
1
> temp = uint8_t(0xA5 + 0xBB);

Das ist ein C++-Konstruktor, aber kein C-Typecast.

> Wie bekomme ich denn die Warnung weg?

Naja, erstmal, indem du -Wno-overflow angibst. ;-)

Das ließe sich auch über Pragmas nur auf eine Funktion eingrenzen.

Ich vermute, wenn du den Typecast korrekt angibst, geht sie auch weg.

von A. S. (Gast)


Lesenswert?

Also Klammern um uint8_t

(uint8_t)(100+200)

Aber warum soll er nicht warnen? Wenn du weißt das es Quatsch ist, dann 
schreib doch lieber das hin, was Du möchtest. Ein Cast ist ziemlich 
übel, da er ... alle möglichen Warnungen verhindert.

von Jens (Gast)


Lesenswert?

Jörg W. schrieb:
>> temp = uint8_t(0xA5 + 0xBB);
> Das ist ein C++-Konstruktor, aber kein C-Typecast.

Ja, da habe ich einen Fehler gemacht. natürlich muss es sein
temp = (uint8_t)(0xA5 + 0xBB);

A. S. schrieb:
> Aber warum soll er nicht warnen? Wenn du weißt das es Quatsch ist, dann
> schreib doch lieber das hin, was Du möchtest. Ein Cast ist ziemlich
> übel, da er ... alle möglichen Warnungen verhindert.

nun ja, ich möchte ja das haben. quasi alles was über uint8_t is weg.
Aber mit dem richtigen cast ist auch die Warnung weg

von A. S. (Gast)


Lesenswert?

Jens schrieb:
> nun ja, ich möchte ja das haben

dann zieh doch 256 ab, wenn Du so eine konstante zahl hast. Oder Verunde 
das mit 0xff, damit der compiler weiß, was Du möchtest.

Das Problem beim Cast ist, dass er dann ALLES als Werte erlaubt, also 
auch z.B. einen Pointer statt dem Wert auf den er zeigt.

von die Warnung ist sinnvoll und richtig (Gast)


Lesenswert?

A. S. schrieb:
> dann zieh doch 256 ab, wenn Du so eine konstante zahl hast

hier wird auch nicht gemeckert.
1
 uint8_t temp = (0xA5 + 0xBB) % 256;

Und man muss nicht davon ausgehen dass die Summe > 255 ist.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.