Basis van programmeren in C

int en unsigned int zijn 32 bits. Welke van de volgende bewerkingen is volgens de C-standaard ongedefinieerd gedrag?

  1. A1 optellen bij een variabele van het type unsigned int waarvan de waarde het maximum 4294967295 is
  2. BEen negatieve int-waarde met >> 1 bit naar rechts schuiven
  3. C1 optellen bij een variabele van het type int waarvan de waarde het maximum 2147483647 is
Antwoord en toelichting tonen

Antwoord: C. 1 optellen bij een variabele van het type int waarvan de waarde het maximum 2147483647 is

Een bewerking met integers met teken waarvan het resultaat het weer te geven bereik overschrijdt, zoals 2147483647 + 1 bij int, is ongedefinieerd gedrag. Voor rekenen met integers zonder teken ligt vast dat het resultaat de rest bij deling door 2³² is, dus 4294967295 + 1 geeft 0 en is geen ongedefinieerd gedrag. Een negatieve waarde naar rechts schuiven is door de implementatie bepaald gedrag: de implementatie bepaalt of het een rekenkundige shift of een logische shift is, en gcc gebruikt een rekenkundige shift. Een negatieve waarde naar links schuiven is daarentegen ongedefinieerd gedrag.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Basis van programmeren in C

  1. Als de bovenstaande functie met gcc met ingeschakelde optimalisatie wordt gecompileerd, kan de controle if (p == NULL) worden verwijderd. Wat is de reden?
  2. Wat legt de C-standaard vast over de grootte van het type int?
  3. In embedded programma's wordt een variabele die de waarde van een 32-bits randapparaatregister bevat, vaak gedeclareerd met uint32_t uit stdint.h in plaats van unsigned int. Wat is de belangrijkste reden?
  4. Wat is de uitvoer als de bovenstaande code, die een deling van gehele getallen bevat, wordt uitgevoerd?
  5. Wat is de uitvoer als de bovenstaande code met prefix- en postfix-++ wordt uitgevoerd?