Grundlagen der Programmiersprache C

int und unsigned int haben 32 Bit. Was davon ist nach dem C-Standard undefiniertes Verhalten?

  1. AZu einer unsigned-int-Variablen mit dem Maximalwert 4294967295 wird 1 addiert
  2. BEin negativer int-Wert wird mit >> um 1 Bit nach rechts geschoben
  3. CZu einer int-Variablen mit dem Maximalwert 2147483647 wird 1 addiert
Antwort und Erläuterung anzeigen

Antwort: C. Zu einer int-Variablen mit dem Maximalwert 2147483647 wird 1 addiert

Überschreitet das Ergebnis einer Operation mit vorzeichenbehafteten Ganzzahlen den darstellbaren Bereich, wie bei 2147483647 + 1 mit int, ist das undefiniertes Verhalten. Für Operationen mit vorzeichenlosen Ganzzahlen ist festgelegt, dass sie auf den Rest der Division durch 2³² zurückfallen; 4294967295 + 1 ergibt daher 0 und ist kein undefiniertes Verhalten. Ob ein Rechtsshift eines negativen Werts als arithmetischer Shift oder als logischer Shift erfolgt, bestimmt die Implementierung (implementierungsdefiniertes Verhalten); bei gcc ist es ein arithmetischer Shift. Ein Linksshift eines negativen Werts ist dagegen undefiniertes Verhalten.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Grundlagen der Programmiersprache C

  1. Wird die obige Funktion mit gcc und aktivierter Optimierung kompiliert, kann die Prüfung if (p == NULL) entfernt werden. Was ist der Grund dafür?
  2. Was legt der C-Standard über die Größe des Typs int fest?
  3. In Embedded-Programmen wird eine Variable für den Wert eines 32-Bit-Peripherieregisters oft nicht als unsigned int, sondern als uint32_t aus stdint.h deklariert. Was ist der Hauptgrund dafür?
  4. Welche Ausgabe erzeugt der obige Code mit einer Division zweier Ganzzahlen bei der Ausführung?
  5. Welche Ausgabe erzeugt der obige Code mit Präfix- und Postfix-++ bei der Ausführung?