2013-02-15 16 views
10

Qual è il comportamento definito in C per UINT_MAX + 1u? Quanto è sicuro assumere che sia zero?UINT_MAX + 1 è uguale a cosa?

+3

@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

+0

@netcoder, sulla mia macchina Windows 64-bit hai effettivamente ragione. Il mio compilatore interno è difettoso. :-) –

risposta

21

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.

+9

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

+1

2^3.4594316186372973 - 1 – Vortico

+0

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

5

È sicuro. Lo standard C garantisce che il numero intero senza segno overflow risultati di wrap-around in zero.

+2

E C in senso stretto, gli interi senza segno non superano mai l'overflow di interi con segno. – ouah

+0

@ouah In questo caso, cosa dovrei dire che fanno? –

+1

@ H2CO3: si potrebbe dire che si avvolgono. –

8

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