¿C # formato literal corto / largo / int?

174

En C / C # / etc. puede decirle al compilador que un número literal no es lo que parece ser (es decir, en floatlugar de double, en unsigned longlugar de int:

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

etc.

¿Podría alguien señalarme una lista de estos? Estoy buscando específicamente un sufijo para shorto Int16.

3Dave
fuente
posible duplicado de Definir diferentes tipos de números en C #
Daniel Renshaw
Hable acerca de una serie de respuestas ... Votos a favor para todos.
3Dave

Respuestas:

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

Creo que eso es todo ... no hay especificadores literales para short / ushort / byte / sbyte

Thomas Levesque
fuente
10
¿Esto significa que tiene que emitir en todos los lugares donde usa short / ushort / byte / sbyte? Por ejemplo: somebyte = somebool? (byte) 1: (byte) 0;
mola
3
@mola, sí, a menos que el tipo deseado no sea ambiguo (por ejemplo byte b = 42;)
Thomas Levesque
2
@molasomebyte = (byte)(somebool ? 1 : 0);
u hor
2
Solo para agregar que las mayúsculas y minúsculas de estos sufijos literales son equivalentes, por ejemplo, 1ly 1Lambas serán tratadas como un entero largo, pero ciertamente 1Les más legible que 1l.
RBT
1
@DzmitryLahoda, ¿qué quieres decir? Los sufijos discutidos en ese tema aún no están implementados.
Thomas Levesque
40

De §2.4.4.2 Literales enteros :

El tipo de un literal entero se determina de la siguiente manera:

  • Si el literal no tiene sufijo, que tiene el primero de este tipo en el que su valor se puede representar: int, uint, long, ulong.
  • Si el literal tiene el sufijo Uo u, tiene el primero de estos tipos en el que su valor puede representarse: uint, ulong.
  • Si el literal tiene el sufijo Lo l, tiene el primero de estos tipos en el que su valor puede representarse: long, ulong.
  • Si el literal es el sufijo UL, Ul, uL, ul, LU, Lu, lU, o lu, que es de tipo ulong.

Y de §2.4.4.3 Literales reales :

Si no se especifica un sufijo de tipo real, el tipo del literal real es doble. De lo contrario, el sufijo de tipo real determina el tipo del literal real, de la siguiente manera:

  • Un literal real con sufijo Fo fes de tipo float. Por ejemplo, los literales 1f, 1.5f, 1e10f, y 123.456Fson todos de tipo float.
  • Un literal real con sufijo Do des de tipo double. Por ejemplo, los literales 1d, 1.5d, 1e10d, y 123.456Dson todos de tipo double.
  • Un literal real con sufijo Mo mes de tipo decimal. Por ejemplo, los literales 1m, 1.5m, 1e10m, y 123.456Mson todos de tipo decimal. Este literal se convierte en un valor decimal tomando el valor exacto y, si es necesario, redondeando al valor representable más cercano utilizando el redondeo bancario (Sección 4.1.7). Cualquier escala aparente en el literal se conserva a menos que el valor se redondee o el valor sea cero (en este último caso, el signo y la escala serán 0). Por lo tanto, el literal 2.900mse analizará para formar el decimal con signo 0, coeficiente 2900y escala 3.
BoltClock
fuente
9

Si su variable aún no es corta, debe emitirla explícitamente:

Object s = (Int16) 1;
Chris
fuente
55
Nota al margen: creo que esto provoca una conversión de boxeo.
3Dave
66
Causa boxeo porque Int16 es un tipo de valor y Object es un tipo de referencia.
Scott Marcus
3

No hay uno para abreviar. Solo úsalo short s = 1;.

Aleatorio832
fuente
2
Curiosamente, esto se compila: short z1 = (0 == 1 ? 0 : 1); Pero esto no: short y = 1; short z2 = (0 == 1 ? 0 : y);(lo siento, no se permiten saltos de línea en los comentarios)
yoyo
3
@yoyo: Eso se debe 0a que la rama en si se convierte a int antes de la asignación a z2. Si usa dos shorts en sus ramas, el resultado nuevamente será a short. Con el if / else, el compilador no puede saber que intse puede representar como short.
Oliver