negatives Ergebnis in unsigned

Gast
Lesenswert?
• ▲
▼
Das ergibt einen Überlauf. 254 ist das Ergebnis. Und jetzt kommt der 
Zaubertrick:
1
uint8_t var1 = 7;
2
uint8_t var2 = 5;
3
uint8_t res = var2 - var1;
4

5
if(res >= 0x80)
6
  printf("Das Ergebnis ist: -%u", (res ^ 0xFF) + 1); 
7
else
8
  printf("Das Ergebnis ist: %u", res );

oder
1
uint8_t var1 = 7;
2
uint8_t var2 = 5;
3
uint8_t res = var2 - var1;
4

5
printf("Das Ergebnis ist: %i", (char)res);
Lesenswert?
• ▲
▼
A. schrieb:
> ... jetzt kommt der Zaubertrick:
>
>
1
> uint8_t var1 = 7;
2
> uint8_t var2 = 5;
3
> uint8_t res = var2 - var1;
4
> 
5
> if(res >= 0x80)
6
>   printf("Das Ergebnis ist: -%u", (res ^ 0xFF) + 1);
7
> else
8
>   printf("Das Ergebnis ist: %u", res );
9
>

Das ist ein ausgesprochen blöder Trick. Im folgenden Code findet kein 
Überlauf statt, aber dein "Trick" glaubt das trotzdem und liefert 
folglich ein falsches Ergebnis.
1
uint8_t var1 = 7;
2
uint8_t var2 = 240;
3
uint8_t res = var2 - var1;
4
...
Lesenswert?
• ▲
▼
Hi

Axel S. schrieb:
> uint8_t var2 = 240;

Ich verstehe Eure Tricks nicht - Uint_irgendwas ist doch Unsigned - also 
vorzeichenlos und somit gibt es dort keine negativen Zahlen.

Bei vorzeichenbehafteten Zahlen ist das höchste Bit das Vorzeichen, 
gesetzt ist die Zahl negativ und im 2er-Komplement.
Wobei dann eine signed 8bit 240 negativ ist, eine signed 16bit 240 aber 
noch lange nicht.

MfG
Gast
Lesenswert?
• ▲
▼
Axel S. schrieb:
> A. schrieb:
> Das ist ein ausgesprochen blöder Trick. Im folgenden Code findet kein
> Überlauf statt, aber dein "Trick" glaubt das trotzdem und liefert
> folglich ein falsches Ergebnis.
> uint8_t var1 = 7;
> uint8_t var2 = 240;
> uint8_t res = var2 - var1;
> ...

240 ist auch eine negative Zahl (-16). Aber das muss der TO erst noch 
lernen.
Lesenswert?
• ▲
▼
Patrick J. schrieb:

> Ich verstehe Eure Tricks nicht

Bitte dichte mir nicht irgendwelche Tricks an.

> Uint_irgendwas ist doch Unsigned - also
> vorzeichenlos und somit gibt es dort keine negativen Zahlen.

Ja. Eben.

> Bei vorzeichenbehafteten Zahlen ist das höchste Bit das Vorzeichen,
> gesetzt ist die Zahl negativ und im 2er-Komplement.

Und bei unsigned ist das höchste Bit schlicht das höchste Bit. Es hat 
keine spezielle Bedeutung. Insbesondere taugt es nicht dazu, einen 
Überlauf bei einer vorherigen Rechenoperation anzuzeigen. Genau deswegen 
ist der "Trick" ja so dämlich.

> Wobei dann eine signed 8bit 240 negativ ist, eine signed 16bit 240 aber
> noch lange nicht.

8 Bit signed kann nicht 240 sein. Der Wertebereich geht von -128 bis 
+127.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.