for schleife mit uint8_t für 256 durchlaufe

Persönliche Seite #884932
Lesenswert?

SoLaLa wrote:
> versteh ich jetzt nicht... die Beispiele sind doch alle 3 korrekt, oder
> nicht?

Nein, mathematisch exakt sind sie alle falsch.

Wenn man x anfängt bei 0 zu zählen und immer nur erhöht, kann der Wert 
nie wieder 0 sein. Neuere Versionen von gcc erkennen das und optimieren 
entsprechend, falls nicht entsprechend beschaltert ist 
(-fno-strict-overflow).

gcc release notes state:
> For example, a loop like
>
1
>   for (i = 1; i > 0; i *= 2)
2
>
> is presumably intended to continue looping until i overflows.
> With -fstrict-overflow, the compiler may assume that signed overflow
> will not occur, and transform this into an infinite loop.
> -fstrict-overflow is turned on by default at -O2...
Moderator Persönliche Seite #884963
Lesenswert?

Georg johann Lay wrote:

>> versteh ich jetzt nicht... die Beispiele sind doch alle 3 korrekt, oder
>> nicht?

> Nein, mathematisch exakt sind sie alle falsch.

Es ging aber nicht um Mathematik, sondern um die Regeln der
Programmiersprache C.

Unser Mathe-Prof hatte mal erzählt, dass es einem seiner älteren
Kollegen damals völliges Unverständnis verursacht hat, in einem
FORTRAN-Programm die Zeile

I = I + 1

zu sehen.  Das ist nämlich mathematisch auch völliger Unsinn.
(Pascal hat das besser formuliert als i := i + 1.)

> Wenn man x anfängt bei 0 zu zählen und immer nur erhöht, kann der Wert
> nie wieder 0 sein.

Doch, nach den Regeln der Programmiersprache C schon.  Der OP hat
schließlich ausdrücklich von einem uint8_t geschrieben, und für
den (und nur für den) ist das Verhalten völlig exakt so definiert.

> Neuere Versionen von gcc erkennen das und optimieren
> entsprechend, falls nicht entsprechend beschaltert ist
> (-fno-strict-overflow).

Das bezieht sich nur auf signed overflow, der ist nämlich
implementation defined.  Für unsigned integer Typen sind die Regeln
eindeutig, dass der Überlauf vom jeweiligen Maximalwert nach 0
stillschweigend erfolgt.
#888756
Lesenswert?

Matthias Lipinsky wrote:
> Hi Leute,
>
> Kurze Frage zur for Schleife in C.
>
> for ( x=0; x<256; x++)
> ..
>
> erzeugt ja 256, also 0..255 schleifendurchläufe.  Das ganze geht aber
> nur, wenn ich x als uint16_t deklariere. Wie kann ich das mit einem
> uint8_t erreichen?
>
>
> Danke schonmal

Hallo,
meine Vermutung, 256 passt nicht mehr in unit8_t von daher würde ich es 
mit

for ( x=0;x<=255;x++)

versuchen.

x nimmt in der ursprüngliche Schleife ja in jedem Fall den Wert 256 an.

Kann natürlich sein, dass ich vollkommen falsch liege.

Gruß
Frank
Gast #888916
Lesenswert?

>Kann natürlich sein, dass ich vollkommen falsch liege.
>for ( x=0;x<=255;x++)

Hm.. Solche "Versuche" habe ich vor meinem Posting hier auch schon 
gemacht:
1
for ( x=0;++x!=255;)
2
..
3
for ( x=0;x<255;++x)
#888935
Lesenswert?

Mit einer reinen for-Schleife kann das gar nicht gehen, da diese 
kopfabweisend ist. Sie erlaubt nur 0 bis 255 Durchläufe. Eine 
fußabweisende Schleife erlaubt 1 bis 256 Durchläufe und ist deshalb auch 
vorgeschlagen worden.

Man könnte auch eine Schleife mit 255 Durchläufen verwenden und den 
wiederholten Ausdruck im Anschluss an die Schleife erneut einmal 
ausführen - bringt aber hier keinen Nutzen.

>>Nein, mathematisch exakt sind sie alle falsch.

>Es ging aber nicht um Mathematik, sondern um die Regeln der
>Programmiersprache C.

Selbst rein mathematisch betrachtet ist das korrekt (schließlich ist die 
Informatik nur eine Spezialisierung der Mathematik ;) ) - die Rechnungen 
erfolgen halt alle modulo 256.
Guckst du hier: 
http://de.wikipedia.org/wiki/Kongruenz_%28Zahlentheorie%29

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren