C # короткий / длинный / int литеральный формат?

174

В C / C # / и т.д. вы можете сказать компилятору , что буквальное число не то , что , как представляется, (то есть. floatВместо double, unsigned longвместо того , чтобы int:

var d = 1.0; // double
var f = 1.0f; // float
var u = 1UL; // unsigned long

и т.п.

Может ли кто-нибудь указать мне на список этих? Я специально ищу суффикс для shortили Int16.

3Dave
источник
1
смотрите здесь: stackoverflow.com/questions/166752/c-compiler-number-literals
fixagon
Возможный дубликат определения различных типов чисел в C #
Даниэль Реншоу
Разговор о шквале ответов ... Upvotes для всех.
3Dave

Ответы:

309
var d  = 1.0d;  // double
var d0 = 1.0;   // double
var d1 = 1e+3;  // double
var d2 = 1e-3;  // double
var f  = 1.0f;  // float
var m  = 1.0m;  // decimal
var i  = 1;     // int
var ui = 1U;    // uint
var ul = 1UL;   // ulong
var l  = 1L;    // long

Я думаю, что это все ... нет литералов для коротких / ushort / byte / sbyte

Томас Левеск
источник
10
Означает ли это, что вы должны разыгрывать везде, где вы используете short / ushort / byte / sbyte? Например: somebyte = somebool? (байт) 1: (байт) 0;
Мола
3
@mola, да, если желаемый тип не является однозначным (например byte b = 42;)
Томас Левеск
2
@molasomebyte = (byte)(somebool ? 1 : 0);
или хор
2
Просто добавить , что верхний регистр и нижний регистр этих буквенных суффиксов эквивалентны , например , 1lи 1Lоба будут рассматриваться как длинное целое число , но , безусловно , 1Lявляется более удобным для чтения , чем 1l.
RBT
1
@DzmitryLahoda что ты имеешь ввиду? Суффиксы, обсуждаемые в этом выпуске, еще не реализованы.
Томас Левеск
40

Из §2.4.4.2 целочисленных литералов :

Тип целочисленного литерала определяется следующим образом:

  • Если буквальное не имеет суффикса, он имеет первый из этих типов , в которых его значение может быть представлено: int, uint, long, ulong.
  • Если к литералу добавляется суффикс Uили u, он имеет первый из этих типов, в котором его значение может быть представлено: uint, ulong.
  • Если к литералу добавляется суффикс Lили l, он имеет первый из этих типов, в котором его значение может быть представлено: long, ulong.
  • Если литерал суффиксом UL, Ul, uL, ul, LU, Lu, lU, или lu, это типа ulong.

А из §2.4.4.3 вещественные литералы :

Если суффикс реального типа не указан, тип действительного литерала является двойным. В противном случае суффикс действительного типа определяет тип действительного литерала следующим образом:

  • Настоящий литерал с суффиксом Fили fимеет тип float. Например, литералы 1f, 1.5f, 1e10fи 123.456Fвсе типа float.
  • Настоящий литерал с суффиксом Dили dимеет тип double. Например, литералы 1d, 1.5d, 1e10dи 123.456Dвсе типа double.
  • Настоящий литерал с суффиксом Mили mимеет тип decimal. Например, литералы 1m, 1.5m, 1e10mи 123.456Mвсе типа decimal. Этот литерал преобразуется в десятичное значение путем получения точного значения и, при необходимости, округления до ближайшего представимого значения с использованием округления банкира (раздел 4.1.7). Любая шкала, видимая в литерале, сохраняется, если только значение не округлено или значение не равно нулю (в этом случае знак и масштаб будут равны 0). Следовательно, литерал 2.900mбудет проанализирован, чтобы сформировать десятичное число со знаком 0, коэффициентом 2900и масштабом 3.
BoltClock
источник
9

Если ваша переменная не короткая, вы должны привести ее явно:

Object s = (Int16) 1;
Крис
источник
5
Примечание: я думаю, что это вызывает преобразование бокса.
3Dave
6
Это вызывает бокс, потому что Int16 является типом значения, а Object является ссылочным типом.
Скотт Маркус
3

Там нет одного для краткости. Просто используйте short s = 1;.

Random832
источник
2
Интересно, что это компилируется: short z1 = (0 == 1 ? 0 : 1); Но это не так: short y = 1; short z2 = (0 == 1 ? 0 : y);(извините, в комментариях не допускается разрывов строк)
yoyo
3
@yoyo: Это потому, 0что ветвь if преобразуется в int перед заданием z2. Если вы используете два shorts в своих ветках, результат снова будет short. С помощью if / else компилятор не может знать, что ваш intможет быть представлен как short.
Оливер