Тип константы в "без знака ux = 2147483648;" - PullRequest
2 голосов
/ 23 февраля 2012

Если я напишу это объявление:

unsigned ux = 2147483648;

(2 31 ), будет ли компилятор C рассматривать 2147483648 как значение без знака или со знаком?

I 'Мы слышали, что постоянные значения всегда обрабатываются как подписанные, но я не думаю, что это всегда правильно.

1 Ответ

4 голосов
/ 23 февраля 2012

Значение десятичной константы без суффикса, такой как 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 ) или с бросками. Я отредактирую вопрос.

...