consideri una tipica funzione di valore assoluto (dove per amor di discussione del tipo integrale di dimensione massima è lunga):Esiste un modo sicuro per ottenere il valore assoluto senza segno di un intero con segno, senza attivare l'overflow?
unsigned long abs(long input);
Un'implementazione ingenuo di questo potrebbe essere simile:
unsigned long abs(long input)
{
if (input >= 0)
{
// input is positive
// We know this is safe, because the maximum positive signed
// integer is always less than the maximum positive unsigned one
return static_cast<unsigned long>(input);
}
else
{
return static_cast<unsigned long>(-input); // ut oh...
}
}
Questo il codice attiva un comportamento indefinito, in quanto la negazione di input
può essere eccessiva e l'attivazione dell'overflow dei numeri interi con segno è un comportamento indefinito. Ad esempio, su macchine con complemento a 2 secondi, il valore assoluto di std::numeric_limits<long>::min()
sarà 1 maggiore di std::numeric_limits<long>::max()
.
Cosa può fare un autore di librerie per risolvere questo problema?
Bella risposta, anche se alla tua stessa domanda, ma +1. – Bathsheba