Значение неопределенной десятичной константы, такой как 2147483648
, зависит от значения константы, диапазонов предопределенного типа и, в некоторых случаях, от версии используемого вами стандарта C.
В C89/C90, тип является первым из:
int
long int
unsigned long int
, в которой он подходит.
В C99 и позже, это первый из:
int
long int
long long int
, в которой он подходит.
Вы не сказали нам, что реализация вы используете, но если long int
32 бит на вашей системе, то 2147483648
будет типа unsigned long int
, если у вас есть предварительно C99 компилятор, или (подпись) long long int
если вы имеют компилятор C99 или более поздний.
Но в вашем конкретном случае:
unsigned ux = 2147483648;
это не имеет значения. Если константа имеет тип unsigned int
, то она уже имеет нужный тип, и преобразование не требуется. Если он имеет тип long long int
(как и должно быть на C99 или более поздней версии, данный 32-бит long
), то значение должно быть преобразовано из этого типа в unsigned
. Четко определено преобразование из подписанного типа в неподписанный.
Так что если unsigned
достаточно широкий, чтобы представить значение 2147483648
, то это значение, которое будет храниться в ux
. И если это не так (если, например, unsigned int
- 16 бит), то преобразование приведет к тому, что 0
будет храниться в ux
.
Вы можете осуществлять некоторый контроль над типом константы, добавляя к ней суффикс. Например, 2147483648UL
гарантированно будет иметь какой-то неподписанный тип (это может быть либо unsigned int
, либо unsigned long int
).
Кстати, название вашего вопроса в настоящее время «О классе Cast.(если я пишу unsigned ux = 2147483648 (от 2 до 31-го)), но ваш вопрос не имеет ничего общего с классами (которые не существуют в C) или с листами. Я отредактирую вопрос.
Какая разница? – Mehrdad
Если вы беспокоитесь, используйте спецификатор суффикса 'U' для значения:' unsigned ux = 2147483648U; ' –