www.mikrocontroller.net

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


Autor: StinkyWinky (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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):
#define TG_RESP_LEN 10
#define TG_RESP_IDX_ERRDETECT (TG_RESP_LEN - 1)
#define TG_NO_MASK 0x0f

static uint8 mBufRead[TG_RESP_LEN];
static uint32 mTelegramCnt = 0;


if ((mBufRead[TG_RESP_IDX_ERRDETECT] & TG_NO_MASK) == (mTelegramCnt % 16)) // <- hier

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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch wahr.

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

Autor: StinkyWinky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha.

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.