2013-02-15 12 views
10

Jakie jest zdefiniowane zachowanie w C dla UINT_MAX + 1u? Jak bezpieczne jest założenie, że wynosi zero?UINT_MAX + 1 to co?

+3

@JoshPetitt : Wciąż jest zero. 'UINT_MAX + 1u' jest obliczany jako liczba całkowita bez znaku, co daje' 0', który jest następnie przechowywany w 'long long'. ;-) – netcoder

+0

@netcoder, na moim 64-bitowym komputerze z systemem Windows rzeczywiście jesteś poprawny. Mój wewnętrzny kompilator jest wadliwy. :-) –

Odpowiedz

21

od standardu (C11, 6.2.5 /: 9 mina nacisk)

[...] Wyliczoną udziałem unsigned parametrami może nie nadmiar, ponieważ wynik, który nie może być reprezentowane przez wynikowy niepodpisany typ całkowity to zredukowany modulo, który jest o jeden większy od największej wartości, która może być reprezentowana przez wynikowy typ.

Jeśli UINT_MAX jest 10:

(10 + 1) % (10 + 1) == 0 

Tak, tak, to jest bezpiecznie założyć, że to zero.

+9

Standardowe mandaty, że 'UINT_MAX' (i maksymalne wartości innych niepodpisanych typów całkowitych) to' 2^N - 1', gdzie 'N' jest szerokością typu, więc 10 jest złym przykładem (ale to doesn ' t powstrzymać mnie przed przegraną). –

+1

2^3.4594316186372973 - 1 – Vortico

+0

Ponadto, '(bez znaku) -1 == UINT_MAX'; ten drugi może być użyty w warunkach preprocesora, podczas gdy '(unsigned) -1' może być oceniony przez kompilator. – Loic

5

Jest bezpieczny. Standard C gwarantuje, że przepełnienie bez znaku całkowitego przepełnienie spowoduje zerowanie.

+2

I C ściśle rzecz biorąc, liczby całkowite bez znaku nigdy nie przepełniają tylko przepełnione liczby całkowite ze znakiem. – ouah

+0

@ouah W takim przypadku, co powinienem powiedzieć? –

+1

@ H2CO3: można powiedzieć, że zawijają się. –

8

Warto podkreślić, że podczas unsigned zachowanie jest dobrze zdefiniowane, podpisał całkowitą przepełnienia nie jest:

w języku programowania C, podpisana liczba całkowita przepełnienie powoduje niezdefiniowane zachowanie, natomiast niepodpisane całkowite przekroczenie powoduje, że liczba ulega zmniejszeniu lo potęgą liczby dwa

bardzo dobrym papierze na temat:

PRZYKŁADY C/C++ INTEGER operacji i ich wyników

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