C # короткий / длинный / int литеральный формат? - PullRequest
158 голосов
/ 28 апреля 2011

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

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

и т.д.

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

Ответы [ 4 ]

267 голосов
/ 28 апреля 2011
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

Я думаю, что все ... нет буквальных спецификаторов для short / ushort / byte / sbyte

39 голосов
/ 28 апреля 2011

С §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.
8 голосов
/ 14 марта 2013

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

Object s = (Int16) 1;
3 голосов
/ 28 апреля 2011

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

...