2012-02-23 2 views
2

Если я пишу эту декларацию:Тип константы в "unsigned ux = 2147483648;"

unsigned ux = 2147483648; 

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

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

+0

Какая разница? – Mehrdad

+1

Если вы беспокоитесь, используйте спецификатор суффикса 'U' для значения:' unsigned ux = 2147483648U; ' –

ответ

4

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

+0

Спасибо, Кейт. Ваш ответ довольно большой и достаточно продуманный. Спасибо. Кстати. , Я должен сказать вам, что я студент из китайского университета, поэтому, возможно, я сделал неверный перевод на английский язык о «отливке», я не говорю разницы между двумя словами: «литой» и «контрверсии». Спасибо снова! – FreeMind

+0

@FreeMind: «Преобразование» - это операция, которая преобразует значение одного типа в другой тип. «Cast» - это явный оператор, такой как '(int) x', который указывает преобразование. (Многие путают их.) –