Sto riscontrando problemi nel rilevare se una somma/moltiplicazione di due numeri supera il valore massimo di un intero lungo. Codice
Esempio:numero java supera long.max_value - come rilevare?
long a = 2 * Long.MAX_VALUE;
System.out.println("long.max * smth > long.max... or is it? a=" + a);
Questo mi dà -2
, mentre io aspetterei a gettare un NumberFormatException
...
Esiste un modo semplice di fare questo lavoro? Perché ho un codice che fa moltiplicazioni in blocchi IF annidati o aggiunte in un ciclo e non vorrei aggiungere più IF a ogni IF o all'interno del ciclo.
Edit: Oh, bene, sembra che questa risposta da un'altra domanda è la più appropriata per quello che mi serve: https://stackoverflow.com/a/9057367/540394
Non voglio fare la boxe/unboxing in quanto aggiunge in testa unnecassary, e in questo modo è molto Insomma, questo è un grande vantaggio per me. Scriverò solo due brevi funzioni per fare questi controlli e restituire il minimo o il massimo.
Edit2: ecco la funzione per limitare una lunga al suo valore min/max in base alla risposta che ho linkato sopra:
/**
* @param a : one of the two numbers added/multiplied
* @param b : the other of the two numbers
* @param c : the result of the addition/multiplication
* @return the minimum or maximum value of a long integer if addition/multiplication of a and b is less than Long.MIN_VALUE or more than Long.MAX_VALUE
*/
public static long limitLong(long a, long b, long c)
{
return (((a > 0) && (b > 0) && (c <= 0))
? Long.MAX_VALUE
: (((a < 0) && (b < 0) && (c >= 0)) ? Long.MIN_VALUE : c));
}
Dimmi se si pensa che questo è sbagliato.
+1. Ci dovrebbe essere una libreria che consente il rilevamento di overflow di interi. – Thilo
O blocchi speciali (qualcosa come finalmente?) Che può aiutare gli sviluppatori a abilitare il comportamento di errore su overflow per tutto il codice matematico che viene eseguito all'interno di. Credo che C# ne abbia uno. EDIT: trovato, [blocchi selezionati e deselezionati in C#] (http://msdn.microsoft.com/en-us/library/a569z7k8.aspx). –
Bene, C# sembra generare errori in overflow (che preferirei molto al silenzio e risultati errati che non hanno senso per me) ... – jurchiks