2010-06-24 22 views
11

Ho un ciclo for che continua ad incrementare un valore intero fino al completamento del ciclo. Quindi se il limite n è una variabile doppia e la variabile incrementata 'i' è un numero intero, viene incrementato oltre i suoi limiti.Incremento di un valore intero oltre il limite intero - C#

Cosa succede a "i" se supera la sua capacità? Come cambia il valore di i? Otterrò un errore di runtime?

Grazie

NLV

+1

Quale lingua? – sharptooth

+0

Modificato il titolo. – NLV

+1

Ho aggiunto il tag C# alla domanda. Per alcune persone (almeno per me) è più utile. SO consente di filtrare in/out in base ai tag e di ottenere elenchi di domande in base a un tag. Il più delle volte guardo solo tag specifici per i quali sono interessato e solo ogni tanto ottengo un elenco delle domande più recenti indipendentemente dal tag. –

risposta

8

Simile al comportamento in alcuni impianti di C in cui uno int si avvolge solo da INT_MAX a INT_MIN (anche se in realtà è un comportamento non definito in base allo standard ISO), anche C# esegue il wrapping. Provarlo in VS2008 con:

int x = 2147483647; 
if (x+1 < x) { 
    MessageBox.Show("It wrapped..."); 
} 

comporterà l'appering della casella di messaggio.

Se il valore hugetValue è superiore al valore massimo int, il ciclo verrà eseguito per sempre a causa di questo.

Ad esempio, se si tratta di 2147483648, proprio come si pensa che stai ricevendo vicino ad esso, i int avvolge intorno da 2147483647 torna a -2147483648 e il ciclo continua solo ad andare avanti.

+0

Ho scritto in C#. Scusa per non averlo menzionato. Non capisco la tua risposta. – NLV

+0

@NLV: alcuni vanno per C#. – leppie

+0

@NLV: ho modificato la domanda per includere il tag C#. Si noti che in molte domande il linguaggio è importante (alcuni consentono la conversione implicitamente, altri non lo consentiranno in fase di compilazione). Quando fai una domanda, più informazioni fornisci - in termini ragionevoli - meglio è. –

3

Mi scuso se questo sembra scortese, ma si impara molto di più provando da soli.

Modificato: aha, quindi l'avete provato e ottenuto risultati inaspettati. Come è stato spiegato altrove, le lingue simili a C tendono a racchiudere in silenzio l'aritmetica intera. Questo è in genere un comportamento abbastanza ragionevole in generale se il costo del controllo per l'overflow è elevato. Una volta che sai che questo può accadere con un codice attentamente, specialmente guardando il tipo di costrutto nel tuo esempio.

+0

L'ho preso nel giusto senso. In realtà l'ho provato ed è stato bloccato in un loop infinito. Quando ho effettuato il debug, ho visto il valore di i in negativo. Mi stavo chiedendo perché non avesse lanciato un errore e invece stava continuando il ciclo. Qualche ragione per quello? – NLV

+0

Qui ci sono due problemi diversi, perché la conversione produce un numero negativo e perché il compilatore non si lamenta della condizione in cui il valore è negativo. L'ultima è la più semplice: potresti modificare la variabile di loop all'interno del loop e renderla negativa. Rilevare se ciò accada o meno è un problema troppo complesso da provare per il compilatore, quindi si presuppone che tu sappia cosa vuoi (o lo troverai presto quando sei bloccato nel tuo ciclo infinito) –

2

Se si desidera un'eccezione, fornire l'opzione del compilatore checked o utilizzare il costrutto checked fornito in C#.

+0

Solo per citare una fonte: http://msdn.microsoft.com/en-us/library/a569z7k8.aspx Fondamentalmente tutte le operazioni sono deselezionate, a meno che non si stiano utilizzando le costanti su entrambi i lati - quelle sono controllate in fase di compilazione. –

Problemi correlati