2015-04-12 5 views
0

Текстом из учебника:Разница между 0 и 0u

Тип UINT является 32-битовым беззнаковым целым типом. Его значением по умолчанию является число 0u или 0U (эти два эквивалента). Буква «u» указывает , что номер имеет тип uint (иначе он понимается как int).

Есть ли разница между 0 и 0u? Если нет, то почему значение по умолчанию «0u». В чем преимущество суффикса целого с «u»?

Почему бы мне не использовать, скажем, «5u», вместо того, чтобы просто использовать «5»?

+0

Чтобы показать, что он неподписан. Некоторые значения лучше представлены как абсолютные, например, расстояния. – Carcigenicate

+0

Одним из возможных вариантов использования «5u» является то, что вам нравится использовать ключевое слово «var». Если вы напишете «var j = 5;», тогда он будет сохранен как int и если вы напишите «var j = 5u;», то он будет сохранен как uint. – discussedtree

+0

@ Карцигенетическое "uint distance = 730480;". Не нужно было использовать суффикс «u» здесь. – discussedtree

ответ

1

Их тип отличается. Хотя недопустимый целочисленный литерал может быть интерпретирован либо как uint, либо int в зависимости от контекста, суффикс u принуждает его к неподписанному типу. Например, нельзя назначить 5u переменной int без литой, поскольку она имеет значение uint.

Вы бы использовали его, когда имеет значение тип выражения. Например, var i = 5 составляет i a int, но var i = 5u составляет i a uint.

Вы также можете использовать его для выбора перегрузки при передаче литерала в качестве параметра. Например:

void Foo(int x); 
void Foo(uint x); 

Foo(5); 
Foo(5u); 

В общем, тем не менее, вам это не нужно часто.

+0

Почему значение по умолчанию uint '0u', а не '0'? – discussedtree

+1

Потому что '0' и' 0u' не имеют одного и того же типа, а '0u' -' uint'. – zneak

2

По умолчанию компилятор выводит числовой литерал как двойной, так и целочисленный.

  • Если буква содержит десятичную точку или экспоненциальный символ, это двойной.
  • В противном случае тип литерала - первый тип в этот список, который может соответствовать значению буква: int, uint, long, ulong.

Суффиксы и (или U), и л (или L), редко бывают необходимы, потому что UINT, длинные и ULong типы могут почти всегда быть либо заключений или неявно преобразуется из INT:

long i=5; //implicit lossless conversion from int literal to long 

Точно так же суффикс d также избыточен, поскольку все литералы с десятичной точкой считаются двойными.

double x= 4.0d; //(Here, d is redundant) 

Диафрагменных (с плавающей точкой) и т (десятичный) суффиксы являются наиболее полезными и всегда должны быть применены при указании поплавка или десятичных литералов. Без суффикса f следующие строки не будут компилироваться, потому что 3.5 будет выведен как тип double, который не имеет никакого неявного преобразования в float.

float f= 3.5f; 

Аналогично, следующая строка не будет компилироваться без суффикса m (decimal).

decimal d=-1.25m; 

В заключении суффиксы предписывает компилятор считать интегральный литерал (например 123), чтобы быть определенным типа number-, например долго. Аналогичным образом, двойной литерал считается другим типом - например, float, decimal и т. Д.

+0

В 'long i = 5',' '' 'буква' int ', или он выводится как 'long' literal? Если первое, означает ли это, что преобразование выполняется, когда оно присваивается 'i'? – Mark

Смежные вопросы