L'overflow di numeri interi senza segno è ben definito dagli standard C e C ++. Ad esempio, lo standard C99 ( §6.2.5/9
) afferma
Un calcolo che coinvolge operandi senza segno non può mai sovraccaricare, poiché un risultato che non può essere rappresentato dal tipo intero senza segno risultante viene ridotto nel modulo che è uno maggiore del valore più grande che può essere rappresentato dal tipo risultante.
Tuttavia, entrambi gli standard affermano che l'overflow di numeri interi con segno è un comportamento indefinito. Ancora una volta, dallo standard C99 ( §3.4.3/1
)
Un esempio di comportamento indefinito è il comportamento sul overflow del numero intero
C'è una ragione storica o (anche meglio!) Una ragione tecnica per questa discrepanza?
if (a + b < a)
). L'overflow della moltiplicazione è difficile sia per i tipi firmati che per quelli non firmati.
MAX_INT+1 == -0
, mentre su un complemento a due sarebbeINT_MIN