2013-04-14 14 views
5

Ho appreso (almeno in java) che i valori interi/lunghi sono in overflow in modo silenzioso ei loro valori ricominciano dal valore minimo in overflow anziché generare eccezioni.Perché i tipi di dati integer vanno in overflow in modo silenzioso piuttosto che generare un'eccezione

Stavo usando una API esterna per alcune operazioni sui file, in cui la dimensione massima del file veniva caricata da un file di proprietà. Tutto andava bene nel mio ambiente di test locale. Non appena il codice è passato all'ambiente live, il limite massimo della dimensione del file non funzionava affatto. Dopo due giorni di debug/analisi del codice, non ci fu alcun successo. Quindi, per altri motivi, ho preso il file constants.properties e ho eseguito il debug del codice con quello. o_0

Voglio solo chiedere, che cosa ha impedito loro di gettare un'eccezione sull'overflow?

+3

Prestazioni. Il controllo dell'overflow dopo ogni operazione matematica è costoso. Richiederebbe un confronto e un ramo, per ogni addizione o moltiplicazione. – MTilsted

+0

[Perché le lingue non aumentano gli errori sull'intero overflow di default?] (Http://stackoverflow.com/q/103654/995714) –

risposta

3

In molti casi Java è basato su C o C++ e questi sono basati su Assembly. Un overflow/underflow è silenzioso in C e C++ e quasi silenzioso in assembly (a meno che non si controllino i flag speciali). Ciò è probabilmente dovuto al fatto che C e C++ non hanno avuto eccezioni al momento della prima proposta. Se si desidera visualizzare overflow/underflow, è sufficiente utilizzare un tipo più grande. per esempio. long long int o long double;) L'assembly BTW ha qualcosa di simile alle eccezioni chiamate trap o interrupt, overflow/underflow non causa una trappola AFAIK.

Quello che preferisco fare è usare long e double a meno che non sia sicuro che questi tipi siano molto più grandi del necessario. Non è possibile avere un dispositivo che trabocca di dimensioni long.

+0

'Non è possibile avere un dispositivo che trabocca di dimensioni lunghe '. Questa affermazione vale un milione di punti, un fatto semplice che non viene in mente all'inizio. Grazie. –

+1

Forse un giorno ce ne sarà uno in Java, ma il file dovrebbe superare i 9 miliardi di GB. –

+1

Forse in quei tempi, le lingue di oggi sarebbero in I.T. musei. –

1

Il motivo è "perché la specifica del linguaggio Java lo dice".

Section 4.2.2. Integer Operations della JLS dice:

Gli operatori interi non indicano overflow o underflow in alcun modo.

+1

Eh? Perché il downvote? Come è questa risposta "non utile"? (Questa risposta è in realtà corretta) – Bohemian

+0

+1 sfortunatamente, la SO a volte la comunità non apprezza la verità – Ingo

+0

La domanda era alla ricerca del motivo per cui il linguaggio è stato creato in questo modo (da qui la parola perché), puntando alle specifiche non fornisce alcun ragionamento. –

Problemi correlati