Значение десятичной константы без суффикса, такой как 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
).
Кстати, заголовок вашего вопроса в настоящее время "About Cast Cast. (Если я пишу без знака ux = 2147483648 (от 2 до 31-го числа))", но ваш вопрос не имеет ничего общего с классами (которых нет в C ) или с бросками. Я отредактирую вопрос.