Supponiamo di avere due variabili size_t
e ho bisogno di moltiplicarle e ottenere il risultato come size_t
.Eventuali problemi di moltiplicazione con potenziale overflow e quindi verifica con divisione?
size_t first = ...;
size_t second = ...;
size_t result = first * second;
Potrebbero traboccare quindi ho bisogno di controllare per quello.
Il modo "pulito" sarebbe di controllare in primo che la moltiplicazione è possibile utilizzando divisione:
if(second != 0 && first > ((size_t)-1)/second) {
//handle overflow
}
//proceed with computing first * second
Il modo apparentemente meno "pulito" è moltiplicare e poi controllare il risultato con divisione:
Tuttavia, poiché la moltiplicazione di numeri non firmati "overflow in modo sicuro" avvolgendo intorno allo zero, funziona perfettamente e sembra equivalente al codice precedente (che prima controlla, quindi moltiplica).
Ci sono potenziali problemi con il secondo codice? Sarà sempre buono come il primo?
Questa domanda mi ha ricordato [questo tweet] (https://twitter.com/fugueish/status/637715389519015941) che ho visto qualche giorno fa. – Borgleader
Potrebbe non essere ovvio per tutti che '-1' [convertirà sempre al massimo valore senza segno] (http://stackoverflow.com/q/22801069/1708801) –
L'unica cosa che posso vedere è nel secondo esempio stai facendo incondizionatamente la moltiplicazione in modo che possa essere un overhead in più. – NathanOliver