In de C-taal vinden in expressies vaak typeconversies (type promotion, type conversion) plaats, gereguleerd door de standaard:
char, short) worden automatisch omgezet naar int of unsigned int vóór wiskundige bewerkingen.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.
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.
Verhaal
Bij het berekenen van gemiddelde intensiteit van een afbeelding werden
intenunsigned intdoor 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 metint. Bij het controleren van de uitgangsvoorwaarde van de array werd vergelekenint 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".