Forum: PC-Programmierung warning: comparison between signed and unsigned


von StinkyWinky (Gast)


Lesenswert?

Hallo Gemeinde

Ich dachte, dass Berechnungen in C grundsätzlich als (signed) Integer 
durchgeführt werden. Nun reklamiert der GCC aber folgenden Code 
(Auschnitt):
1
#define TG_RESP_LEN 10
2
#define TG_RESP_IDX_ERRDETECT (TG_RESP_LEN - 1)
3
#define TG_NO_MASK 0x0f
4
5
static uint8 mBufRead[TG_RESP_LEN];
6
static uint32 mTelegramCnt = 0;
7
8
9
if ((mBufRead[TG_RESP_IDX_ERRDETECT] & TG_NO_MASK) == (mTelegramCnt % 16)) // <- hier
1
K:\source\sys\comValve.c 262 warning: comparison between signed and unsigned

Wenn ich die linke Hälfte des Vergleiches auf (unsigned int) caste, ist 
der gcc zufrieden.

Ich verstehe nicht, warum die linke Hälfte angeblich vom Typ int sein 
soll, während die rechte Hälfte unsigned int sei.

von Klaus W. (mfgkw)


Lesenswert?

StinkyWinky schrieb:
> Berechnungen in C grundsätzlich als (signed) Integer

nein.
Wenn eine unsigned genommen wird, wird mit dieser auch in unsigned 
gerechnet, z.B. hier: mBufRead[TG_RESP_IDX_ERRDETECT] & TG_NO_MASK
Das Feldelement ist uint_8, also wird das & auch ein unsigned
ergeben.

Aus dem % auf der rechten Seite dagegen kommt eine signed raus.

von Karl H. (kbuchegg)


Lesenswert?

Klaus Wachtler schrieb:
> StinkyWinky schrieb:
>> Berechnungen in C grundsätzlich als (signed) Integer
>
> nein.
> Wenn eine unsigned genommen wird, wird mit dieser auch in unsigned
> gerechnet, z.B. hier: mBufRead[TG_RESP_IDX_ERRDETECT] & TG_NO_MASK
> Das Feldelement ist uint_8, also wird das & auch ein unsigned
> ergeben.
>
> Aus dem % auf der rechten Seite dagegen kommt eine signed raus.

Ich denke, da hast du dich jetzt verfranst.
Die rechte Seite ist unsigned.

Aber die linke.
Die ist zunächst uint8_t wird aber für den Vergleich auf den nächst 
höheren Datentyp angehoben. Das geschieht aber so, dass es auf den 
Datentyp hochgecastet wird, der den Wertebereich abdecken kann. Ein 
signed int kann alle Werte eines unsigned char abdecken. Und damit wird 
die linke Seite zu einem int.

(Es ist allerdings noch sehr früh und mein Kaffe läuft gerade erst durch 
die Maschine)

von Klaus W. (mfgkw)


Lesenswert?

Auch wahr.

Dann lasse ich nur noch mein "nein" stehen, das stimmt jedenfalls :-)

von StinkyWinky (Gast)


Lesenswert?

Aha.

Dann mache ich wohl ein
1
if ((mBufRead[TG_RESP_IDX_ERRDETECT] & TG_NO_MASK) == (uint8)(mTelegramCnt % 16))
daraus, dann braucht links nichts (implizit) gecastet zu werden.

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.