Zitat:
Zitat von Siro
Habe mich dann dafür entschieden, sobald "ein" Signed im Spiel ist,
beide Operatoren als Signed zu interpretieren.
Nun, die Herren und Damen, die den C-Standard festsetzen, entschieden sich eben anders...
Zitat:
Wie die C-Compiler das nun auswerten, da habe ich natürlich keinen Einfluß.
Man hat aber Einfluß darauf, die C-Doku zu lesen :-)
Zitat:
Ich bin nur wirklich erstaunt, daß es in meinem Beispiel schief läuft und das völlig ohne irgend ein Warning.
Freilich muss man Warnungen auch aktivieren und berücksichtigen. Als Optionen sind mindestend -W -Wall ratsam, und mein avr-gcc warnt die Stelle auch an.
"foo.c:7: warning: comparison between signed and unsigned"
Zitat:
Was ich aber überhaupt nicht verstehe:
[...] es ist absolut sichergestllet, daß ein positiver Wert rauskommt.
Und genau diesen Wert soll er ja einsetzten.
Ob signed oder unsigned ist hier völlig unerheblich.
Es ist lediglich eine "Konstante". Wie kommt er dazu meinen als
signed definierten "index" als unsigned zu interpretieren?
Der Compiler muss eben einen Vergleich ausführen, und den kann er signed oder unsigned machen. Der C-Standard ergibt, daß der Vergleich auf unsigned zu machen ist. Auf einer Maschine, wo ein int 32 Bits groß ist, könnte eine Promotion nach 32 Bits stattfinden, und das Ergebnis wäre wie von dir erwartet. Aber hier ist ein int 16 Bits groß und es wird nicht über int-Größe hinaus erweitert.
An manchen Stellen ist der C-Standard so geschrieben daß "vernünftiger" Code gut optimierbar ist. Beispiel sind etwa die Strict-Aliasing-Rules oder die etwas seltsame EIgenschaft von Shifts: Ein wert in einer Schleife 100x um 1 nach links zu schieben gibt idR was anderes, als ein << 100.
Zitat:
Im nächsten Leben schreibe ich meine Compiler selber.
Spass muss sein.
Dann ist der Compiler aber die falsche Baustelle für dich, zumindest wenn es ein Compiler werden soll, der sich an Standards hält. Du musst schon zur Fraktion der Standard-Schreiber wechseln :-)