Qual è il comportamento definito in C per UINT_MAX + 1u
? Quanto è sicuro assumere che sia zero?UINT_MAX + 1 è uguale a cosa?
risposta
Dalla standard (C11, 6.2.5/9, enfasi mia):
[...] Un calcolo coinvolge operandi unsigned può mai troppopieno, perché un risultato che non può essere rappresentato da il tipo intero senza segno risultante è modulo ridotto il numero che è maggiore del valore massimo che può essere rappresentato dal tipo risultante.
Se UINT_MAX
è 10
:
(10 + 1) % (10 + 1) == 0
Quindi, sì, è lecito ritenere che sia pari a zero.
Lo standard stabilisce che 'UINT_MAX' (e i valori massimi di altri tipi di interi non firmati) sia' 2^N - 1', dove 'N' è la larghezza del tipo, quindi 10 è un cattivo esempio (ma che non lo fa t fermarmi dal upvoting). –
2^3.4594316186372973 - 1 – Vortico
Inoltre, '(senza segno) -1 == UINT_MAX'; quest'ultimo può essere usato in condizioni di pre-elaborazione, mentre '(unsigned) -1' può essere valutato solo dal compilatore. – Loic
È sicuro. Lo standard C garantisce che il numero intero senza segno overflow risultati di wrap-around in zero.
E C in senso stretto, gli interi senza segno non superano mai l'overflow di interi con segno. – ouah
@ouah In questo caso, cosa dovrei dire che fanno? –
@ H2CO3: si potrebbe dire che si avvolgono. –
dovrebbe essere sicuro:
Annotare l'int unsigned trabocco è ben definito.
Inoltre, ecco uno whole question su questo.
Vale la pena sottolineare che, mentre unsigned comportamento è ben definito, firmato integer overflow non è:
Nel linguaggio di programmazione C, firmato integer overflow causa il comportamento non definito di , mentre l'overflow di un intero senza segno causa la riduzione del numero ecco una potenza di due
Un'ottima documento sull'argomento:
ESEMPI DI C/C++ INTERO OPERAZIONI E LORO RISULTATI
Expression Result
---------- ------
UINT_MAX+1 0
LONG_MAX+1 undefined
INT_MAX+1 undefined
SHRT_MAX+1 SHRT_MAX+1 if INT_MAX>SHRT_MAX, otherwise undefined
char c = CHAR_MAX; c++ varies
-INT_MIN undefined
(char)INT_MAX commonly -1
1<<-1 undefined
1<<0 1
1<<31 commonly INT_MIN in ANSI C and C++98; undefined in C99 and C++11
1<<32 undefined
1/0 undefined
INT_MIN%-1 undefined in C11, otherwise undefined in practice
- 1. php non è uguale a non è uguale, uguale a
- 2. Cosa fa uguale a ngRepeat?
- 3. Perché byte b = (byte) 0xFF è uguale a intero -1?
- 4. Che cosa è questo operatore * = -1
- 5. Corba è uguale a SOA?
- 6. Cosa significa punto interrogativo uguale a CoffeeScript?
- 7. Dp è uguale a dip?
- 8. Java è uguale a una classe. == uguale a .equals
- 9. blocco C diventa espressione: ({int a = 1; int b = 2; a + b;}) è uguale a 3
- 10. == rispetto è uguale a C#
- 11. È GMT uguale a UTC?
- 12. Java è uguale a() ordinare
- 13. Scala: Fa == l'impostazione predefinita è uguale a?
- 14. Perché non 0.9 ricorrente sempre uguale 1
- 15. Quicksort - motivo è uguale a controlli
- 16. È R.layout.listview è uguale a R.id.listview
- 17. è Object.getPrototypeOf() uguale a Object.constructor.prototype in Javascript?
- 18. È php deg2rad() uguale a mysql radians()
- 19. Dottrina findBy 'non è uguale a'
- 20. Perché lista [:: - 1] non uguale lista [: len (lista): - 1]?
- 21. IsBusy di BackgroundWorker è uguale a "IsAlive"?
- 22. meno o uguale a
- 23. Il file Java è uguale a
- 24. È "a +++ i" uguale a "(a ++) + i" in C
- 25. vim-airline: cosa è "! Trailing [1]"
- 26. Classe A non è uguale a Classe A
- 27. Controllo di convalida (se 1 è uguale a qualche valore dal database) Laravel 5
- 28. Maiuscole/minuscole è uguale a Hibernate Criteri
- 29. Perché! == "" non è uguale a! == null
- 30. Perché double.class non è uguale a java.lang.Double.class?
@JoshPetitt : Comunque è ancora zero. 'UINT_MAX + 1u' viene valutato come un numero intero senza segno, risultante in' 0', che viene quindi memorizzato in un 'long long'. ;-) – netcoder
@netcoder, sulla mia macchina Windows 64-bit hai effettivamente ragione. Il mio compilatore interno è difettoso. :-) –