Hallo, Was passiert eigentlich wenn ich das mache (AVR GCC): uint8_t data=0; data--; ist data jetzt 0, 255 oder irgendwas undefiniertes? Danke
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.
ok, das heißt für mich: immer prüfen. uint8_t data=0; ... if(data > 0) data--; else // Fehler ... Danke!
> 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.
> > 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?
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".
Ein vorher undefiniertes Byte (nicht initialisiert) ist auch nach einem Dekrement nicht initialisiert. Halt nur um 1 niedriger ;-)
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.
Weil das Überlaufverhalten in C nur für vorzeichenlose Typen definiert ist.
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.