Grundlagen der Programmiersprache C
Ein Programm, das c aus „char c = 200;“ mit %d von printf ausgibt, zeigt nach dem Kompilieren mit gcc für Linux auf x86-64 den Wert −56, mit gcc für Linux auf Arm dagegen 200. Was ist der Grund für den Unterschied?
- AArm ist Big-Endian, daher wird die Bytereihenfolge umgekehrt gelesen
- BOb ein char ohne signed oder unsigned vorzeichenbehaftet oder vorzeichenlos ist, bestimmt die Implementierung; auf x86-64 ist er vorzeichenbehaftet, auf Arm vorzeichenlos
- CAuf x86-64 hat char 16 Bit, und das obere Bit wird als Vorzeichen behandelt
Antwort und Erläuterung anzeigen
Antwort: B. Ob ein char ohne signed oder unsigned vorzeichenbehaftet oder vorzeichenlos ist, bestimmt die Implementierung; auf x86-64 ist er vorzeichenbehaftet, auf Arm vorzeichenlos
Ob ein char ohne signed oder unsigned vorzeichenbehaftet oder vorzeichenlos ist, legt der Standard nicht fest, sondern überlässt es der Implementierung (implementierungsdefiniert). Unter Linux auf x86-64 ist char vorzeichenbehaftet und kann nur −128 bis 127 darstellen; speichert man 200, ergibt sich 200 − 256 = −56. Unter Linux auf Arm oder RISC-V ist char vorzeichenlos, und 200 wird unverändert gespeichert. Für Bytedaten verwendet man unsigned char oder uint8_t, damit die Behandlung des Vorzeichens eindeutig ist.
Weiter: 9 weitere Fragen zu Grundlagen der Programmiersprache C