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


von bert (Gast)


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

von Peter (Gast)


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.

von bert (Gast)


Lesenswert?

ok, das heißt für mich: immer prüfen.

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

Danke!

von Rolf Magnus (Gast)


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.

von Peter (Gast)


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?

von Hc Z. (mizch)


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".

von Phantomix X. (phantomix)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Rolf Magnus (Gast)


Lesenswert?

Weil das Überlaufverhalten in C nur für vorzeichenlose Typen definiert 
ist.

von Hc Z. (mizch)


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.

von bert (Gast)


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!

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.