Bereichsüberschreitung
-
Ich habe einen unsigned char, der in einer Schleife inkrementiert wird.
Spart ihr euch die Prüfung aufgrund der möglichen Bereichsüberschreitung?Also so:
static unsigned char ch = 0; int main() { while(true) { //Do something here ch++ //Do something here } return 0; }Oder prüft ihr:
static unsigned char ch = 0; int main() { while(true) { //Do something here if(ch==255) { ch=0; } else { ch++; } //Do something here } return 0; }Oder anders?
Gruß
Sigi
-
Das kommt ganz darauf an, was ich bezwecken will. Ich weiß normalerweise genau, welchen Wert meine Variablen wann haben. Es kommt nur ganz ganz selten vor, dass ich solche Prüfungen benötige.
Im übrigen ist bei unsigned Datentypen garantiert, dass der Maximalwert + 1 wieder 0 ist.
-
Das kommt ganz darauf an, was ich bezwecken will. Ich weiß normalerweise genau, welchen Wert meine Variablen wann haben. Es kommt nur ganz ganz selten vor, dass ich solche Prüfungen benötige.
Ja, normalerweise schon.. ist hier aber nicht so.
Im übrigen ist bei unsigned Datentypen garantiert, dass der Maximalwert + 1 wieder 0 ist.
Kannst Du mir auch sagen, wo das steht?
-
S1g1 schrieb:
Im übrigen ist bei unsigned Datentypen garantiert, dass der Maximalwert + 1 wieder 0 ist.
Kannst Du mir auch sagen, wo das steht?
na, wenn du 1Byte hast: Wertebereich 0 bis 255
wenn du nun 255+1 machst, hast einen Überlauf, und du landest dann natürlich wieder bei 0... was anderes kanns ja auch net sein oO
-
S1g1 schrieb:
Im übrigen ist bei unsigned Datentypen garantiert, dass der Maximalwert + 1 wieder 0 ist.
Kannst Du mir auch sagen, wo das steht?
C++ Standard 3.9.1, Absatz 4 schrieb:
Unsigned integers, declared unsigned, shall obey the laws of arithmetic modulo 2n where n is the number of bits in the value representation of that particular size of integer.
Zugehörige Randnotiz:
This implies that unsigned arithmetic does not overflow because a result hat cannot be represented by the resulting unsigned integer type is reduced modulo the number that is one greater than the largest value that can be represented by the resulting unsigned integer type.
Und char ist ein Integertyp nach den vorhergehenden Absätzen. Es ist dort jedoch nicht garantiert, dass char ein unsigned Typ ist. Dies ist implementiergungsabhängig. Will man sicher gehen, gibt es dafür die Typen signed char und unsigned char.
P.S.: Und es ist auch nicht definiert, dass die Bereichsüberschreitung bei unsigned char bei 255 stattfindet. Dies ist bloß der Mindestwert.
-
SeppJ schrieb:
P.S.: Und es ist auch nicht definiert, dass die Bereichsüberschreitung bei unsigned char bei 255 stattfindet. Dies ist bloß der Mindestwert.
Hmm, aber ein char hat doch in cpp 8bit oder ?
Was soll dann nach 255 passieren, wenn ein Überlauf nicht stattfinden würde ?
-
Ok, danke SeppJ! Das sollte mir genügen.
Imho find ich es trotzdem besser prinzipiell gegen Bereichsgrenzen zu prüfen. Ich denke Du meinst mit Deinem letzten Satz, dass man mit limits.h arbeiten soll oder?Viele Grüße
Sigi
-
Dweb schrieb:
Hmm, aber ein char hat doch in cpp 8bit oder ?
Was soll dann nach 255 passieren, wenn ein Überlauf nicht stattfinden würde ?Nein, 8Bit ist der Mindestwert. Und dann hätte der char nachher eben den Wert 256 und die Bereichsüberschreitung findet beispielweise erst bei 16767 statt.
Wir hatten neulich schon einmal diese Diskussion, da hatte jemand berichtet, dass ihm tatsächlich mal ein System mit 65 Bit chars untergekommen ist.
Slgl schrieb:
Ok, danke SeppJ! Das sollte mir genügen.
Imho find ich es trotzdem besser prinzipiell gegen Bereichsgrenzen zu prüfen. Ich denke Du meinst mit Deinem letzten Satz, dass man mit limits.h arbeiten soll oder?Wenn diese Grenzen für dein Programm wichtig sind: Ja.
Es ist auch möglich, solche Annahmen bei oder vor der Compilierung zu prüfen. Vor der Compilierung prüft man dies häufig mittels von Installationsskripts (siehe beispielsweise GNU Autotools), während der Compilierung kann man dies mittels Template-Metaprogrammierung überprüfen. Letzteres ist jedoch nicht ganz einfach.