2013-05-19 6 views

risposta

30

Sì, lo fa. L'overflow di interi con segno è un comportamento non definito, quindi potrebbe accadere qualsiasi cosa (inclusa l'eccezione generata).

Come nota a margine, devo dire che è improbabile che ciò accada (ma sicuramente possibile) per la maggior parte delle implementazioni; come cita il C++ 11 standard in una nota al paragrafo 5/4:

Se durante la valutazione di un'espressione, il risultato non è matematicamente definita o meno nell'intervallo valori rappresentabili per il suo tipo, il comportamento non è definito. [Nota: la maggior parte delle implementazioni esistenti di C++ ignorano l'integer overflow. Trattamento della divisione per zero, formando un resto utilizzando un divisore zero e tutte le eccezioni a virgola mobile variano tra le macchine e sono generalmente regolabili mediante una funzione di libreria. Nota -end]

As hvd mentions in the comments, tuttavia, alcune implementazioni consentono di fornire gestori personalizzati per integer overflow, e quei gestori possono buttare.

+2

Touche. È geniale. – chris

+0

Sottile, ma sicuramente possibile! –

+0

Dato che l'aggiunta di un intero è fondamentalmente C, non C++, non credo che * qualsiasi compilatore * possa mai lanciare un'eccezione per esso. – Dave

4

La regola generale è tutto ciò che è può essere scritto in C non può e non deve generare un'eccezione ...

Di conseguenza, non sarebbe.

Come dice Andy, questo comportamento non è definito in modo che tutto possa accadere. In teoria il computer potrebbe anche farti una tazza di caffè e portare il tuo cane a fare una passeggiata. Comunque se tu fossi in un colloquio di lavoro, ti suggerirei di dirgli di no :)

+4

Le regole mal concepite fanno male ai pollici. Non puoi scrivere "it" in C perché l'overflow firmato in C non è permesso, proprio come in C++. –

+0

'sizeof ('a')' può essere scritto in C ma risulta in vaulue diversi (e lo fanno sulla maggior parte delle piattaforme).Inoltre, il comportamento non definito su C potrebbe comportare un'eccezione: provare la divisione intero per zero, che si traduce in un'eccezione hardware su molte piattaforme (dato che non è un'eccezione C++ ...). –

Problemi correlati