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

Відповіді:


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

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


10
Чи означає це, що вам доведеться робити трансляцію скрізь, де ви використовуєте короткий / ushort / byte / sbyte? Напр .: somebyte = somebool? (байт) 1: (байт) 0;
mola

3
@mola, так, якщо бажаний тип не є однозначним (наприклад byte b = 42;)
Thomas Levesque

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.

9

Якщо ваша змінна ще не є короткою, її потрібно чітко вказати:

Object s = (Int16) 1;

5
Бічна примітка: Я думаю, що це спричиняє перетворення боксу.
3Dave

6
Це викликає бокс, оскільки Int16 - тип значення, а Object - тип посилання.
Скотт Маркус

3

Короткого немає. Просто використовуйте short s = 1;.


2
Цікаво це компіляція: short z1 = (0 == 1 ? 0 : 1); Але це не так: short y = 1; short z2 = (0 == 1 ? 0 : y);(вибачте, не допускається жодних перерв у коментарях)
yoyo

3
@yoyo: Це тому, що 0гілка if перетворюється в a int перед призначенням z2. Якщо ви використовуєте два shorts у своїх гілках, результат знову буде a short. За допомогою if / else компілятор не може знати, що ваш файл intможе бути представлений як short.
Олівер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.