C # formato literal curto / longo / int?

174

Em C / C # / etc., você pode dizer ao compilador que um número literal não é o que parece ser (ou seja, em floatvez de double, em unsigned longvez de int:

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

etc.

Alguém poderia me indicar uma lista deles? Estou procurando especificamente um sufixo para shortor Int16.

3Dave
fonte
possível duplicata de Definição de diferentes tipos de números em C #
Daniel Renshaw
Fale sobre uma enxurrada de respostas ... Upvotes para todos.
precisa saber é o seguinte

Respostas:

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

Eu acho que é tudo ... não há especificadores literais para short / ushort / byte / sbyte

Thomas Levesque
fonte
10
Isso significa que você precisa transmitir em todos os lugares que usa short / ushort / byte / sbyte? Ex .: somebyte = somebool? (byte) 1: (byte) 0;
Mola
3
@mola, sim, a menos que o tipo desejado é ambígua (por exemplo, byte b = 42;)
Thomas Levesque
2
@molasomebyte = (byte)(somebool ? 1 : 0);
ou hor
2
Apenas para acrescentar que maiúsculas e minúsculas desses sufixos literais são equivalentes, por exemplo, 1le 1Lambos serão tratados como um número inteiro longo, mas certamente 1Lsão mais legíveis que 1l.
RBT 21/03
1
@DzmitryLahoda, o que você quer dizer? Os sufixos discutidos nesse problema ainda não foram implementados.
Thomas Levesque
40

De §2.4.4.2 Literais inteiros :

O tipo de um literal inteiro é determinado da seguinte maneira:

  • Se o literal tem nenhum sufixo, tem o primeiro desses tipos em que o seu valor pode ser representados: int, uint, long, ulong.
  • Se o literal tiver o sufixo Uor ou u, ele possui o primeiro desses tipos em que seu valor pode ser representado: uint, ulong.
  • Se o literal tiver o sufixo Lor ou l, ele possui o primeiro desses tipos em que seu valor pode ser representado: long, ulong.
  • Se o literal é o sufixo UL, Ul, uL, ul, LU, Lu, lU, ou lu, é do tipo ulong.

E de §2.4.4.3 literais reais :

Se nenhum sufixo de tipo real for especificado, o tipo do literal real será duplo. Caso contrário, o sufixo do tipo real determina o tipo do literal real, da seguinte maneira:

  • Um literal real com o sufixo Fou fé do tipo float. Por exemplo, os literais 1f, 1.5f, 1e10f, e 123.456Fsão todos do tipo float.
  • Um literal real com o sufixo Dou dé do tipo double. Por exemplo, os literais 1d, 1.5d, 1e10d, e 123.456Dsão todos do tipo double.
  • Um literal real com o sufixo Mou mé do tipo decimal. Por exemplo, os literais 1m, 1.5m, 1e10m, e 123.456Msão todos do tipo decimal. Esse literal é convertido em um valor decimal, assumindo o valor exato e, se necessário, arredondando para o valor representável mais próximo usando o arredondamento de banca (Seção 4.1.7). Qualquer escala aparente no literal é preservada, a menos que o valor seja arredondado ou o valor seja zero (nesse caso, o sinal e a escala serão 0). Portanto, o literal 2.900mserá analisado para formar o decimal com sinal 0, coeficiente 2900e escala 3.
BoltClock
fonte
9

Se sua variável ainda não é curta, você deve convertê-la explicitamente:

Object s = (Int16) 1;
Chris
fonte
5
Nota lateral: acho que isso causa uma conversão de boxe.
precisa saber é o seguinte
6
Isso causa boxe porque Int16 é um tipo de valor e Object é um tipo de referência.
Scott Marcus
3

Não há um para abreviar. Apenas use short s = 1;.

Random832
fonte
2
Curiosamente Isso compila: short z1 = (0 == 1 ? 0 : 1); mas isso não: short y = 1; short z2 = (0 == 1 ? 0 : y);(desculpe, sem quebras de linha permitidos nos comentários)
yoyo
3
@ yoyo: Isso ocorre porque o 0ramo if é convertido em um int antes da atribuição para z2. Se você usar dois shorts em seus ramos, o resultado será novamente a short. Com o if / else, o compilador não pode saber que você intpode ser representado como short.
Oliver