Wegen integer promotion wird doch die Subtraktion mit int's durchgeführt
und dann das Ergebnis einem int-Rückgabewert zugewiesen. Also ist diese
Typumwandlung an dieser Stelle gar nicht nötig.
Bei glibc wird ja gleich zu Beginn umgewandelt. Aber erst bei einer
return-Aweisung? Das ist doch gar nicht nötig oder?
zitter_ned_aso schrieb:> Wegen integer promotion wird doch die Subtraktion mit int's durchgeführt
Mal ganz generell gefragt: was genau hast du eigentlich mit der lib vor?
Nutz die, wie sie ist, oder lass es.
Oliver
In der gnu-Version fallen mir unnötige casts auf, um const zu entfernen.
Aber c1/c2 werden nie verändert. Die musl-Variante ist zwar sehr knapp
gehalten, aber frei von solchen "Unzulänglichkeiten". Und der cast auf
unsigned Char wird gebraucht, um Zeichen >127 korrekt zu vergleichen.
zitter_ned_aso schrieb:> return *(unsigned char *)l - *(unsigned char *)r;> Wegen integer promotion wird doch die Subtraktion mit int's durchgeführt> und dann das Ergebnis einem int-Rückgabewert zugewiesen. Also ist diese> Typumwandlung an dieser Stelle gar nicht nötig.
nach langem Überlegen:
Integer promotion findet natürlich statt. Allerdings werden da falsche
Zahlen zu Integer's befördert weil es bei den Buchstaben mit dem
ASCII-Code > 127 einen Überlauf gibt (bei signed char). Und diese,
falsche Zahl, wird nach "int" umgewandelt.
Bei mir funktioniert's übrigens auch wenn BEIDE Buchstaben >127 sind
ohne explizite Typumwandlung.
1
return*l-*r;
Dann gibt es ja für beide einen Überlauf, aber der Abstand bleibt ja
trotzdem gleich. Aber so ein Überlauf ist ja bei signed-Werten nicht
definiert.Wenn es nur bei einem Buchstaben diesen Überlauf gibt, dann
geht die Version ohne explizites Casten in die Hose.
Und dann habe ich noch eine Frage:
Warum wird die erste Variante akzeptiert und bei der zweiten - gewarnt?
zitter_ned_aso schrieb:>> Bei mir funktioniert's übrigens auch wenn BEIDE Buchstaben >127 sind> ohne explizite Typumwandlung.>
Aber manchmal hat man <=127/>127 gemischt.
Z.B. "aaaa" vs. "ääää". Was sagt dann dein Algorithmus?
Carl D. schrieb:> Z.B. "aaaa" vs. "ääää"
na dann bekomme ich ein falsches Ergebnis, habe ich doch oben
geschrieben.
bei 'a' gibt es keine Überlauf, bei 'ä' schon.
zitter_ned_aso schrieb:> Wenn es nur bei einem Buchstaben diesen Überlauf gibt, dann> geht die Version ohne explizites Casten in die Hose.
Es gibt nirgendwo einen Überlauf.
Du hast ein 8-Bit-Muster und je nach Interpretation entspricht das
-128..127 (signed char) oder 0..255 (unsgined char). Die Erweiterung
nach int ist in beiden Fällen eindeutig definiert und die folgende
(int-)Subtraktion erfolgt ohne Überlauf, liefert aber je nach
Interpretation unterschiedliche Ergebnisse.
ANSI-C verlangt bei strcmp (und auch bei memcmp) die
unsigned-Interpretation.
zitter_ned_aso schrieb:> Warum ist das kein Überlauf?
Es ist einfach nur eine andere Interpretierung der Bits.
Übrigens gibt es in C per Definition keine Überläufe.
angezeigt. Im string werden die Zeichen aus dem erweiterten
ASCII-Zeichensatz direkt akzeptiert, als einzelne char's jedoch nicht
(egal ob signed/unsigned). Diese muss man dann codiert eingeben oder
wchar nutzen.
leo schrieb:> Rolf M. schrieb:>> Übrigens gibt es in C per Definition keine Überläufe.>> Quelle bitte.
Aus ISO/IEC 9899. Ok, stimmt nicht ganz. Bei Gleitkomma-Typen kann es
Überläufe geben.
Zu unsigned Integern:
"A computation involving unsigned operands can never overflow,
because a result that 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 type."
Bei vorzeichenbehafteten Integern darf man nicht auf einen Überlauf
vertrauen, da das Verhalten undefiniert ist. Dazu hab ich direkt keine
Passage gefunden, außer vielleicht dieser:
"If an exceptional condition occurs during the evaluation of an
expression (that is, if the result is not mathematically defined or not
in the range of representable values for its type), the behavior is
undefined.
leo schrieb:> Rolf M. schrieb:>> Zu unsigned Integern:>> Du hattest nur diese gemeint oder auch signed integer?
Hatte ich doch geschrieben:
Rolf M. schrieb:> Bei vorzeichenbehafteten Integern darf man nicht auf einen Überlauf> vertrauen, da das Verhalten undefiniert ist.leo schrieb:> $ pdftotext c-std-n1256.pdf - | grep -c overflow> 33
Das Wort "overflow" kommt schon vor, dennoch ist es so, dass unsigned
integer nicht überlaufen können und ein Überlaufverhalten für
signed-Integer nicht definiert ist.
Rolf M. schrieb:> und ein Überlaufverhalten für> signed-Integer nicht definiert ist.
Ja, haette ich genauer lesen muessen. Wie auch immer Overflow passiert
;)
leo
Eine eigene Frage?
Dieser Thread ist über 6 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.