ProgrammatieC ontwikkelaar

Welke regels voor typeconversie (type conversion, type promotion) worden toegepast in expressies in de C-taal? Geef voorbeelden van onverwachte fouten en oplossingen.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In de C-taal vinden in expressies vaak typeconversies (type promotion, type conversion) plaats, gereguleerd door de standaard:

  • Integer Promotion: types met een lagere resolutie (bijvoorbeeld char, short) worden automatisch omgezet naar int of unsigned int vóór wiskundige bewerkingen.
  • Usual Arithmetic Conversions: als de operand verschillende types hebben, worden ze omgezet naar een "breder" type volgens de vastgestelde regels.
  • Bij gemengde bewerkingen met voor- en achterteken types kan het resultaat onverwacht veranderen vanwege de conversie.

Voorbeeld:

unsigned short a = 65535; signed short b = -1; printf("%d\n", a + b); // afhankelijk van de conversie!

Aanbeveling: let goed op de types van de operanden, vooral bij bitbewerkingen, lengtes van arrays, indexen, en vermijd impliciete vermenging van ondertekende en niet-ondertekende types.

Misleidende vraag

Wat geeft het volgende fragment?

unsigned int u = 1; int i = -2; printf("%d\n", u + i);

Antwoord: De variabele i wordt omgezet naar unsigned int, de uiteindelijke waarde wordt erg groot, omdat het resultaat onder de motorkap is: 1U + (unsigned int)-2U, wat een getal oplevert dat dicht bij UINT_MAX (4294967295) ligt. Er wordt een negatief getal afgedrukt alleen als printf is geformatteerd als int, anders rommel.

Voorbeelden van echte fouten door gebrek aan kennis over de nuances van het onderwerp


Verhaal

Bij het berekenen van gemiddelde intensiteit van een afbeelding werden int en unsigned int door elkaar gehaald. Negatieve waarden werden verkeerd omgezet via unsigned en gaven gigantische getallen, wat leidde tot bufferoverloop van de afbeelding.


Verhaal

In de ingebedde firmware werd de lengte van de string berekend met size_t, terwijl een array werd geïndexeerd met int. Bij het controleren van de uitgangsvoorwaarde van de array werd vergeleken int i >= size_t len, wat de logica verbrak voor lange strings en bugs veroorzaakte bij het vergelijken van verschillende types (size_t - unsigned).


Verhaal

Een ontwikkelaar op een financieel project berekende de rest van de deling voor negatieve getallen met %, en vergat dat het teken van het resultaat voor negatieve operanden afhankelijk is van de implementatie. In de ene omgeving was het resultaat positief, in de andere negatief, waardoor de berekeningen af en toe "afweken".