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?

  1. AArm ist Big-Endian, daher wird die Bytereihenfolge umgekehrt gelesen
  2. BOb ein char ohne signed oder unsigned vorzeichenbehaftet oder vorzeichenlos ist, bestimmt die Implementierung; auf x86-64 ist er vorzeichenbehaftet, auf Arm vorzeichenlos
  3. 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.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Grundlagen der Programmiersprache C

  1. Welche Ausgabe erzeugt der obige Code, in dem b++ rechts von && und || steht, bei der Ausführung?
  2. Welche Ausgabe erzeugt die obige switch-Anweisung, die ein case ohne break enthält, bei der Ausführung?
  3. Welche Ausgabe erzeugt das obige Programm bei der Ausführung?
  4. Die obige Funktion f wird dreimal hintereinander aufgerufen. Welcher Rückgabewert ergibt sich beim dritten Aufruf?
  5. Welche Kombination gibt in C die Zeitspanne (Lebensdauer) richtig an, in der (1) eine in einer Funktion ohne static deklarierte lokale Variable, (2) ein mit malloc reservierter Bereich und (3) eine außerhalb von Funktionen deklarierte Variable existieren?