C # formato letterale corto / lungo / int?


174

In C / C # / ecc. Puoi dire al compilatore che un numero letterale non è quello che sembra essere (cioè, floatinvece di double, unsigned longinvece di int:

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

eccetera.

Qualcuno potrebbe indicarmi un elenco di questi? Sto specificatamente cercando un suffisso per shorto Int16.




Parla di una raffica di risposte ... Voti positivi per tutti.
3Dave

Risposte:


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

Penso che sia tutto ... non ci sono specificatori letterali per short / ushort / byte / sbyte


10
Questo significa che devi trasmettere ovunque usi short / ushort / byte / sbyte? Ad esempio: somebyte = somebool? (byte) 1: (byte) 0;
mola,

3
@mola, sì, a meno che il tipo desiderato non sia inequivocabile (ad es. byte b = 42;)
Thomas Levesque

2
@molasomebyte = (byte)(somebool ? 1 : 0);
o hor

2
Solo per aggiungere che maiuscole e minuscole di questi suffissi letterali sono equivalenti, ad esempio, 1led 1Lentrambi saranno trattati come numeri interi lunghi ma sicuramente 1Lpiù leggibili di 1l.
RBT

1
@DzmitryLahoda che vuoi dire? I suffissi discussi in tale numero non sono ancora implementati.
Thomas Levesque,

40

Da §2.4.4.2 Letterali interi :

Il tipo di un intero letterale è determinato come segue:

  • Se il letterale non ha suffisso, ha il primo di questi tipi in cui il suo valore può essere rappresentato: int, uint, long, ulong.
  • Se il valore letterale è suffisso da Uo u, ha il primo di questi tipi in cui può essere rappresentato il suo valore: uint, ulong.
  • Se il valore letterale è suffisso da Lo l, ha il primo di questi tipi in cui può essere rappresentato il suo valore: long, ulong.
  • Se il letterale è suffisso UL, Ul, uL, ul, LU, Lu, lU, o lu, è di tipo ulong.

E da §2.4.4.3 letterali reali :

Se non viene specificato alcun suffisso di tipo reale, il tipo di valore letterale reale è doppio. Altrimenti, il suffisso del tipo reale determina il tipo del vero letterale, come segue:

  • Un vero letterale con il suffisso Fo fè di tipo float. Ad esempio, i letterali 1f, 1.5f, 1e10f, e 123.456Fsono tutti di tipo float.
  • Un vero letterale con il suffisso Do dè di tipo double. Ad esempio, i letterali 1d, 1.5d, 1e10d, e 123.456Dsono tutti di tipo double.
  • Un vero letterale con il suffisso Mo mè di tipo decimal. Ad esempio, i letterali 1m,1.5m , 1e10m, e 123.456Msono tutti di tipo decimal. Questo valore letterale viene convertito in un valore decimale prendendo il valore esatto e, se necessario, arrotondando al valore rappresentabile più vicino usando l'arrotondamento del banco (Sezione 4.1.7). Qualsiasi scala apparente nel letterale viene conservata a meno che il valore non sia arrotondato o il valore sia zero (in questo caso il segno e la scala saranno 0). Quindi, il letterale 2.900mverrà analizzato per formare il decimale con segno 0, coefficiente 2900e scala 3.

9

Se la tua variabile non è già breve, devi lanciarla esplicitamente:

Object s = (Int16) 1;

5
Nota a margine: penso che questo provochi una conversione di boxe.
3Daveva il

6
Causa il pugilato perché Int16 è un tipo di valore e Object è un tipo di riferimento.
Scott Marcus,

3

Non ce n'è uno in breve. Basta usare short s = 1;.


2
È interessante notare che questo compila: short z1 = (0 == 1 ? 0 : 1); Ma questo non lo fa: short y = 1; short z2 = (0 == 1 ? 0 : y);(scusate, nessuna interruzione di riga consentita nei commenti)
yoyo

3
@yoyo: Questo perché il 0ramo if viene convertito in int prima del compito in z2. Se usi due shorts nei tuoi rami, il risultato sarà di nuovo a short. Con if / else, il compilatore non può sapere che il tuo intpuò essere rappresentato come short.
Oliver,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.