C # krótki / długi / format literału int?

174

W C / C # / itd. Możesz powiedzieć kompilatorowi, że liczba literału nie jest tym, czym się wydaje (tj. floatZamiast double, unsigned longzamiast int:

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

itp.

Czy ktoś mógłby wskazać mi ich listę? W szczególności szukam sufiksu dla shortlub Int16.

3Dave
źródło
możliwy duplikat Definiowanie różnych typów liczb w C #
Daniel Renshaw
Porozmawiajcie o lawinie odpowiedzi ... Głosy za wszystkich.
Zapisz

Odpowiedzi:

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

Myślę, że to wszystko ... nie ma żadnych dosłownych specyfikatorów dla krótkiego / ushort / byte / sbyte

Thomas Levesque
źródło
10
Czy to oznacza, że ​​musisz przesyłać wszędzie tam, gdzie używasz short / ushort / byte / sbyte? Np .: somebyte = somebool? (bajt) 1: (bajt) 0;
mola,
3
@mola, tak, chyba że żądany typ jest jednoznaczny (np. byte b = 42;)
Thomas Levesque,
2
@molasomebyte = (byte)(somebool ? 1 : 0);
lub hor
2
Wystarczy dodać, że wielkie i małe litery tych dosłownych przyrostków są równoważne, np. 1lI 1Loba będą traktowane jako długie liczby całkowite, ale z pewnością 1Lsą bardziej czytelne niż 1l.
RBT
1
@DzmitryLahoda co masz na myśli? Przyrostki omówione w tym numerze nie zostały jeszcze zaimplementowane.
Thomas Levesque
40

Od §2.4.4.2 Literały całkowite :

Typ literału liczby całkowitej jest określany w następujący sposób:

  • Jeśli dosłowne ma sufiks, ma pierwszy z tych typów, w której jego wartość może być reprezentowane: int, uint, long, ulong.
  • Jeśli literał ma przyrostek Ulub u, ma pierwszy z tych typów, w którym można przedstawić jego wartość: uint, ulong.
  • Jeśli literał ma przyrostek Llub l, ma pierwszy z tych typów, w którym można przedstawić jego wartość: long, ulong.
  • Jeśli dosłowny jest sufiksem UL, Ul, uL, ul, LU, Lu, lU, lub lu, że jest typu ulong.

Oraz z §2.4.4.3 Prawdziwe literały :

Jeśli nie określono sufiksu typu rzeczywistego, typem prawdziwego literału jest double. W przeciwnym razie przyrostek typu rzeczywistego określa typ literału rzeczywistego w następujący sposób:

  • Prawdziwy dosłowny sufiks Flub fjest typu float. Na przykład, literały 1f, 1.5f, 1e10f, i 123.456Fsą typu float.
  • Prawdziwy dosłowny sufiks Dlub djest typu double. Na przykład, literały 1d, 1.5d, 1e10d, i 123.456Dsą typu double.
  • Prawdziwy dosłowny sufiks Mlub mjest typu decimal. Na przykład, literały 1m, 1.5m, 1e10m, i 123.456Msą typu decimal. Ten literał jest konwertowany na wartość dziesiętną poprzez pobranie dokładnej wartości i, jeśli to konieczne, zaokrąglenie do najbliższej możliwej do przedstawienia wartości za pomocą zaokrąglenia bankiera (sekcja 4.1.7). Każda skala widoczna w literale jest zachowywana, chyba że wartość jest zaokrąglona lub wartość wynosi zero (w tym ostatnim przypadku znak i skala będą wynosić 0). W związku z tym literał 2.900mzostanie przeanalizowany, aby utworzyć ułamek dziesiętny ze znakiem 0, współczynnikiem 2900i skalą 3.
BoltClock
źródło
9

Jeśli twoja zmienna nie jest już krótka, musisz ją jawnie rzutować:

Object s = (Int16) 1;
Chris
źródło
5
Uwaga dodatkowa: myślę, że powoduje to konwersję boksu.
Zapisz
6
Powoduje to opakowanie, ponieważ Int16 jest typem wartości, a Object jest typem referencyjnym.
Scott Marcus
3

Nie ma jednego na krótko. Po prostu użyj short s = 1;.

Losowo 832
źródło
2
Co ciekawe, kompiluje się to: short z1 = (0 == 1 ? 0 : 1); Ale to nie: short y = 1; short z2 = (0 == 1 ? 0 : y);(przepraszam, brak
yoyo
3
@yoyo: To dlatego, 0że gałąź w if jest konwertowana na an int przed przypisaniem do z2. Jeśli użyjesz dwóch shorts w swoich gałęziach, wynikiem ponownie będzie short. Z if / else kompilator nie może wiedzieć, że Twój intmoże być reprezentowany jako short.
Oliver