7H3 N4C3R schrieb:
@Stefan_Sch:
Dass ein char ein Byte groß ist, da bin ich ja noch einverstanden. Beim int ist es zwar auf x86 üblich mit den 4 Byte, aber das ist nicht festgelegt.
Der Datentyp int ist für gewöhnlich 4 Byte groß. Selbst auf einem 64-Bit System entspricht ein int in aller Regel 4 Byte. Es ist zwar richtig, das ein "integer" prinzipiell bestmöglich an den Rechner angepasst ist, genauer gesagt an die Länge des Maschinenregisters, aber das ist Haarspalterei und in diesem Zusammenhang nicht weiter von Belang. Ich nehme kaum an, das der Threadersteller auf einem 16-Bit-Rechner arbeitet, wo ein int die Größe eines short hätte.
7H3 N4C3R schrieb:
Genausowenig muss ein char den Wertebereich -128 - 127 haben. Zum einen natürlich, weil der Standard nicht fest von 8 Bits pro Byte ausgeht ^^ - aber vor allem, weil char signed oder unsigned sein kann.
In meinem Beispiel spreche ich aber
nicht von einem signed oder unsigned char, sondern eindeutig von einem
char, der in diesem Fall implizit signed ist.
Ein char hat in C++ immer 1-Byte. Es ist richtig das der Standard nicht exakt auf die Größe eingeht, stattdessen heißt es dort das ein char eine adressierbare Einheit von Daten sein muss, die groß genug ist um jedes Zeichen des Grundzeichensatzes der Ausführungsumgebung halten zu können. Alle modernen Architekturen gehen bei aber einem Byte von 8-Bit aus, irgendwelche exotischen Embedded Systeme einmal ausgeschlossen. Insofern wird in allen Lehrbüchern auch bei einem Byte von 8-Bit, also einem Wertebereich zwischen -128 to 127 gesprochen. Siehe
http://www.cplusplus.com/doc/tutorial/variables/.
7H3 N4C3R schrieb:
Selbstverständlich sind deine beiden Beispiele nicht das Gleiche und schon garnicht haargenau.
Bei den Vergleichen erzwingt der Vergleich mit int formal eine Erweiterung des chars auf die Größe von int gemäß den Usual Arithmetic Conversions. Das ist ein etwas subtiler Unterschied, der deshalb aber nicht völlig irrelevant ist.
Bei der Initialisierung des chars wird's dann noch etwas interessanter. Zum einen muss natürlich 84 als int erstmal formal in einen char umgewandelt werden - mit den üblichen Gefahren bzw. zumindest lästigen Compilerwarnungen, wenn man breitere Datentypen in schmalere überführt. Außerdem sugerieren deine Beispiele eine gewisse Austauschbarkeit von int und char. Spätestens bei Überladungsauflösung wird es haarig.
Also immer schön langsam. Auch hier ist korrekt das eine arithmetische Standardkonvertierung stattfindet, die ist in meinem Beispiel aber zu 100 Prozent sicher, weil der Standard festlegt das ein int mindestens die Größe eines char aufweisen muss. Bei der Konvertierung von char in int, werden die oberen Bits automatisch mit 0 oder Vorzeichen aufgefüllt, was abhänging von der Voreinstellung für char ist.
Das vielleicht eine 1:1 Austauschbarkeit suggeriert wird, mag vielleicht bei Anfängern der Fall sein, aber ich kann in meinen Beitrag keinen Exkurs über Typkonvertierungen und Datentypen halten.
Ich gehe prinzipiell von dem Kontext und einem Normalfall aus. In diesem Kontext stand das generelle Verhalten an vorderster Stelle und die Erklärung warum 0 und '\0' zu demselben Resultat führen. Gleichzeitig gehe ich von einem Standard 32-Bit IBM PC aus, den der Threadersteller verwendet und nicht von einer PDP-10 Architektur.