L'aggiunta di due interi a 32 bit può causare un overflow di numeri interi:
uint64_t u64_z = u32_x + u32_y;
Questo overflow può essere evitato se uno degli interi a 32 bit viene prima castato o aggiunto a un intero a 64 bit.
uint64_t u64_z = u32_x + u64_a + u32_y;
Tuttavia, se il compilatore decide di riordinare l'aggiunta:
uint64_t u64_z = u32_x + u32_y + u64_a;
il numero intero overflow potrebbe ancora verificarsi.
I compilatori sono autorizzati a fare un tale riordino o possiamo fidarci di loro per notare l'incoerenza del risultato e mantenere l'ordine delle espressioni così com'è?
((uint32_t)-1 + (uint32_t)1) + (uint64_t)0
traduce in 0
, mentre si (uint32_t)-1 + ((uint32_t)1 + (uint64_t)0)
traduce in 0x100000000
, e questi due valori non sono uguali. Quindi è significativo se il compilatore può applicare o meno tale trasformazione. Ma sì, lo standard usa solo la parola "overflow" per interi con segno, non senza segno.
uint32_t
valori aggiunti , che non overflow, vanno a capo. Questi non sono comportamenti diversi.