C # kurz / lang / int Literalformat?

174

In C / C # / usw. können Sie den Compiler sagen , dass eine wörtliche Zahl ist nicht das, was es zu sein scheint (dh. floatStatt double, unsigned longstatt int:

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

etc.

Könnte mich jemand auf eine Liste von diesen verweisen? Ich suche speziell nach einem Suffix für shortoder Int16.

3Dave
quelle
mögliches Duplikat der Definition verschiedener Arten von Zahlen in C #
Daniel Renshaw
Sprechen Sie über eine Flut von Antworten ... Upvotes für alle.
3Dave

Antworten:

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

Ich denke, das ist alles ... es gibt keine wörtlichen Bezeichner für short / ushort / byte / sbyte

Thomas Levesque
quelle
9
Bedeutet das, dass Sie überall, wo Sie short / ushort / byte / sbyte verwenden, umsetzen müssen? ZB: somebyte = somebool? (Byte) 1: (Byte) 0;
Mola
3
@ Mola, ja, es sei denn, der gewünschte Typ ist eindeutig (zB byte b = 42;)
Thomas Levesque
2
@ Molasomebyte = (byte)(somebool ? 1 : 0);
oder Hor
2
Nur um hinzuzufügen, dass Groß- und Kleinbuchstaben dieser Literal-Suffixe äquivalent sind, z. B. 1lund 1Lbeide als lange Ganzzahl behandelt werden, aber sicherlich 1Lbesser lesbar sind als 1l.
RBT
1
@DzmitryLahoda was meinst du? Die in dieser Ausgabe behandelten Suffixe sind noch nicht implementiert.
Thomas Levesque
40

Aus §2.4.4.2 Ganzzahlige Literale :

Der Typ eines Integer-Literal wird wie folgt bestimmt:

  • Wenn die wörtliche kein Suffix hat, hat es die erste dieser Art in dem sein Wert dargestellt werden kann int, uint, long, ulong.
  • Wenn das Literal durch Uoder angehängt wird u, hat es den ersten dieser Typen, in dem sein Wert dargestellt werden kann: uint, ulong.
  • Wenn das Literal durch Loder angehängt wird l, hat es den ersten dieser Typen, in dem sein Wert dargestellt werden kann: long, ulong.
  • Wenn die wörtliche durch suffixed ist UL, Ul, uL, ul, LU, Lu, lU, oder luist es der Typ ulong.

Und aus §2.4.4.3 Echte Literale :

Wenn kein reales Typensuffix angegeben ist, ist der Typ des realen Literal doppelt. Andernfalls bestimmt das Real-Typ-Suffix den Typ des Real-Literal wie folgt:

  • Ein echtes Literal mit Foder ohne fTyp float. Zum Beispiel sind die Literale 1f, 1.5f, 1e10f, und 123.456Falle Art sind float.
  • Ein echtes Literal mit Doder ohne dTyp double. Zum Beispiel sind die Literale 1d, 1.5d, 1e10d, und 123.456Dalle Art sind double.
  • Ein echtes Literal mit Moder ohne mTyp decimal. Zum Beispiel sind die Literale 1m, 1.5m, 1e10m, und 123.456Malle Art sind decimal. Dieses Literal wird in einen Dezimalwert umgewandelt, indem der genaue Wert genommen und gegebenenfalls mithilfe der Bankrundung auf den nächsten darstellbaren Wert gerundet wird (Abschnitt 4.1.7). Jede im Literal sichtbare Skala bleibt erhalten, es sei denn, der Wert ist gerundet oder der Wert ist Null (in letzterem Fall sind Vorzeichen und Skala 0). Daher wird das Literal 2.900manalysiert, um die Dezimalstelle mit Vorzeichen 0, Koeffizient 2900und Skala zu bilden 3.
BoltClock
quelle
9

Wenn Ihre Variable noch nicht kurz ist, müssen Sie sie explizit umwandeln:

Object s = (Int16) 1;
Chris
quelle
5
Randnotiz: Ich denke, dies führt zu einer Box-Konvertierung.
3Dave
6
Dies führt zu Boxen, da Int16 ein Werttyp und Object ein Referenztyp ist.
Scott Marcus
3

Es gibt keinen für kurze. Einfach benutzen short s = 1;.

Random832
quelle
2
Interessanterweise kompiliert dies: short z1 = (0 == 1 ? 0 : 1); Aber das nicht: short y = 1; short z2 = (0 == 1 ? 0 : y);(Entschuldigung, keine Zeilenumbrüche in Kommentaren erlaubt)
yoyo
3
@yoyo: Das liegt daran, dass der 0in der if-Verzweigung in eine int vor der Zuweisung zu konvertiert wird z2. Wenn Sie zwei shorts in Ihren Zweigen verwenden, ist das Ergebnis wieder a short. Mit dem if / else kann der Compiler nicht wissen, dass Ihr intals dargestellt werden kann short.
Oliver