Reguły dla typów dziesiętnych stałych całkowitych uległy zmianie w latach 1990-1999 w standardzie ISO C.
W wersji 1990 danego typu unsuffixed dziesiętna stałą całkowitą jest pierwszy int
, long int
lub unsigned long int
w którym jego wartość może być reprezentowanych. (C90 nie miał typu long long
lub unsigned long long
).
W wersjach 1999 i 2011 jego typ jest jednym z int
, long int
, long long int
; nigdy nie jest typu bez znaku.
Typ konkretnej stałej (np. 2147483648
) będzie różny w zależności od zakresów typów całkowitych używanego kompilatora. Jeśli typ kompilatora to long
jest 32-bitowy, wówczas 2147483648
będzie typu unsigned long
, jeśli twój kompilator używa reguł C90, lub typu long long
, jeśli używa reguł C11 (gwarantowane jest co najmniej 64 bity) (long long
). Kompilator ostrzega cię o tym.
Możesz dodać przyrostki, aby określić typ stałej - ale nie ma sufiksu dla zwykłego podpisu int
. Możesz dodać U
dla unsigned int
, L
dla long
, UL
dla niepodpisanych długich i tak dalej.
Należy pamiętać, że -2147483648
to nie stała całkowita; raczej 2147483648
sama w sobie jest stałą całkowitą, a -2147483648
jest wyrażeniem, które stosuje jednoargumentowy operator minus do tej stałej.Zgodnie z regułami C90, jeśli stała jest typu unsigned long
, jest to niepodpisany jednoargumentowy minus, który zgodnie z regułami niepodpisanej arytmetycznej daje wartość 2147483648
. Zgodnie z regułami C99 lub C11, 2147483648
jest prawdopodobnie typu (podpis) long long
, a negowanie go daje -2147483648
, również typu long long
.
Czasami zobaczysz kod, który używa (-2147483647 - 1)
, aby uniknąć tego problemu; biorąc pod uwagę 32-bitowe int
, 2147483647
jest typu int
, a wynik wyrażenia daje oczekiwaną wartość int
bez przepełnienia.
Oczywiście, jeśli twój kompilator ma różne rozmiary dla typów całkowitych, może to być jeszcze bardziej skomplikowane.
C90 nie ma typu 'long long', dlatego obsługuje takie numery inaczej niż C99. – Lindydancer
FYI: Poprawną odpowiedź można znaleźć tutaj: http://stackoverflow.com/questions/2347936/cant-get-rid-of-this-decimal-constant-is-unsigned-only-in-iso-c90- ostrzeżenie – natersoz