2012-02-08 16 views
15

Che cosa contiene lo unsigned int quando lo overflow? Per essere precisi, voglio fare una moltiplicazione con due unsigned int s: cosa sarà nella unsigned int dopo aver completato la moltiplicazione?Trabocco di Unsigned Int

unsigned int someint = 253473829*13482018273; 
+0

Questo sembra essere un duplicato di http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-c-c –

+1

Perché non provarlo e vedere cosa ottieni? In generale, quando un int unsigned non gira, passa a zero. Quindi 'UINT_MAX + 5' si rovescia e diventa 4. –

+0

Sarebbe la differenza tra il valore uint massimo e il valore di quello che sarebbe stato il valore di overflow. Consente di renderlo semplice. Diciamo che il massimo uint è 5. Si desidera aggiungere 2 * 4 quindi questo rende il valore finale 3 invece di 8. –

risposta

22

unsigned i numeri non possono eccedere, ma al contrario utilizzare le proprietà di modulo.

Ad esempio, quando unsigned int è a 32 bit, il risultato sarebbe: (a * b) mod 2^32.


Come CharlesBailey sottolineato, 253473829*13482018273 può utilizzare la moltiplicazione firmato prima di essere convertito, e così si dovrebbe essere esplicito su unsigned prima della moltiplicazione:

unsigned int someint = 253473829U * 13482018273U; 
+0

è una parte di uno standard? –

+2

@Zhenya Sì, sia in C che in C++. – Pubby

+0

@ Zhenya - Ha importanza? La risposta è corretta al 100%. È un modo più tecnico per dire che UINT_MAX + 5 è 4. Questo probabilmente rimarrebbe vero sia in .NET che in Java. Almeno nel caso di .NET NaN è limitato a tipi come double dove il valore (la maggior parte delle volte) non è rappresentato esattamente. –

5

Unsigned integer overflow, a differenza della sua controparte firmato, mostre comportamento ben definito.

I valori sostanzialmente "avvolgono" intorno. È sicuro e comunemente usato per il conto alla rovescia, o funzioni hashing/mod.

+3

Unsigned non overflow –

+1

Intendevo dire che per fare un confronto provate a spiegarlo riferendomi a qualcosa di simile. Ho qualificato la mia affermazione in seguito con un po 'di dettaglio. Ah tecnicismi. – evandrix

-3

Probabilmente dipende un po 'dal tuo compilatore. Ho avuto errori come questo anni fa, ea volte avresti avuto un errore di runtime, altre volte sarebbe fondamentalmente "ricondotto" a un numero veramente piccolo che risulterebbe dal tagliare i bit di livello più alto e lasciare il resto, cioè se si tratta di un 32 bit unsigned int, e il risultato della vostra moltiplicazione sarebbe un numero a 34 bit, taglierebbe i 2 bit di ordine alto e vi darà il resto. Probabilmente dovresti provarlo sul tuo compilatore per vedere esattamente cosa ottieni, il che potrebbe non essere la stessa cosa che otterresti con un compilatore diverso, specialmente se l'overflow avviene nel mezzo di un'espressione in cui il risultato finale è all'interno del intervallo di un int unsigned

+0

** L'overflow non firmato ** non dipende dal compilatore, è standardizzato per avere una semantica wrap-around. È solo ** overflow firmato ** che porta a valori non definiti e può quindi dipendere dal compilatore. – cmaster