mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Was passiert, wenn ich uint kleiner null mache?


Autor: bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Was passiert eigentlich wenn ich das mache (AVR GCC):

uint8_t data=0;
data--;

ist data jetzt 0, 255 oder irgendwas undefiniertes?

Danke

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint8_t sind immer 8 bit, und 8 Bit sind immer Definiert. Also kenn es 
schon mal nicht undefiniert sein.

Es wird wohl danach 255 sein.

Autor: bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, das heißt für mich: immer prüfen.

uint8_t data=0;
...
if(data > 0)
  data--;
else
  // Fehler
...

Danke!

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> uint8_t sind immer 8 bit, und 8 Bit sind immer Definiert. Also kenn es
> schon mal nicht undefiniert sein.

Stimmt so nicht.

> Es wird wohl danach 255 sein.

Das ist es.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> > uint8_t sind immer 8 bit, und 8 Bit sind immer Definiert. Also kenn es
> > schon mal nicht undefiniert sein.
> Stimmt so nicht.
sagst du auch noch warum nicht?

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorzeichenlose Integer-Typen wrappen, erhalten also den maximalen Wert, 
wenn der minimale um 1 verringert wird.

Für vorzeichenbehaftete garantiert das der C-Standard übrigens nicht, 
das Ergebnis ist dort "undefined".

Autor: Phantomix Ximotnahp (phantomix) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein vorher undefiniertes Byte (nicht initialisiert) ist auch nach einem 
Dekrement nicht initialisiert. Halt nur um 1 niedriger ;-)

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

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
>> > uint8_t sind immer 8 bit, und 8 Bit sind immer Definiert. Also kenn es
>> > schon mal nicht undefiniert sein.
>> Stimmt so nicht.
> sagst du auch noch warum nicht?

Nach deiner 'Definition' wäre grundsätzlich alles und jedes in einem 
Computer definiert. Denn irgendeinen Wert muss ja jedes Bit haben. Es 
wird ja nicht aus dem Nichts heraus erzeugt, sondern ist hardwaremässig 
immer vorhanden.

Mit undefiniert ist aber gemeint: Ist in der Sprachdefinition für diesen 
Fall eine Regel vorhanden, die dem Programmierer (und auch dem 
Compilerbauer) die Information liefert, welcher Wert nach der Operation 
vorliegen muss.

Und in diesem Fall ist genau das der Fall.
Für unsigned Rechnungen ist im C-Standard tatsächlich festgelegt, wie 
sich die Berechnung verhalten muss, wenn ein Overflow bzw. Underflow 
erfolgt.
Und das hat nichts mit 8 Bit zu tun, sondern damit, dass es sich um 
unsigned Arithmetik handelt.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil das Überlaufverhalten in C nur für vorzeichenlose Typen definiert 
ist.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> uint8_t sind immer 8 bit, und 8 Bit sind immer Definiert.

Natürlich ist für jeden elementaren Typ der Wertebereich definiert; das 
ist banal.

Dir Frage richtete sich aber nicht auf den Wertebereich, sondern eine 
bestimmte arithmetische Operation, die auf einen solchen Typ angewandt 
wird.  Und mit einer kleinen Modifikation wäre die schon undefiniert 
gewesen, obwohl es sich immer noch um 8 Bit gehandelt hätte.  Obige 
Aussage ist also im vorhandenen Kontext eine Nullaussage und beantwortet 
die Frage (wenn sie denn als brauchbare Lösung in Betracht käme) falsch.

Autor: bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also damit wäre das Problem ausführlich beantwortet. Aufgrund der 
besseren Lesbarkeit und Nachvollziehbarkeit werde ich den Überlauf trotz 
definierten Verhaltens wohl vermeiden.

Dank!

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.