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
@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. :-) –