C#の短い/長い/ intリテラル形式?


174

C / C#の/などでは、リテラルの数は(と思われるものではないことをコンパイラに伝えることができ、すなわち。float代わりにdoubleunsigned long代わりにint

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

誰かが私にこれらのリストを教えてもらえますか?具体的には、shortまたはのサフィックスを探していますInt16




さまざまな回答について話し合う...みんなの賛成票。
3Dave

回答:


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

それだけだと思います... short / ushort / byte / sbyteのリテラル指定子はありません


10
これは、short / ushort / byte / sbyteを使用するすべての場所にキャストする必要があることを意味しますか?例:somebyte = somebool?(バイト)1:(バイト)0;
モラ2013

3
@mola、はい、必要なタイプが明確でない限り(例byte b = 42;
Thomas Levesque

2
@molasomebyte = (byte)(somebool ? 1 : 0);
またはhor

2
これらのリテラル接尾辞の大文字と小文字は同じであることを追加するだけで、たとえば1l1L両方とも長整数として扱われますが、確か1Lにより読みやすくなってい1lます。
RBT 2017年

1
@dzmitryLahodaどういう意味ですか?その問題で説明されているサフィックスはまだ実装されていません。
トーマスレベスク

40

§2.4.4.2整数リテラルから:

整数リテラルのタイプは、次のように決定されます。

  • :リテラルは接尾辞を持っていない場合は、その値を表現することができるこれらのタイプの最初のを持ってintuintlongulong
  • リテラルの末尾にUor が付いている場合、そのリテラルはu、値を表現できる最初のタイプです:uintulong
  • リテラルの末尾にLor が付いている場合、そのリテラルはl、値を表現できる最初のタイプです:longulong
  • リテラルがサフィックスされている場合はULUluLulLULulU、またはlu、それが型ですulong

そして、§2.4.4.3本当のリテラルから:

実際のタイプのサフィックスが指定されていない場合、実際のリテラルのタイプはdoubleです。それ以外の場合は、次のように、実際のタイプのサフィックスによって実際のリテラルのタイプが決まります。

  • 本当のリテラルはサフィックスFまたはf型ですfloat。例えば、リテラル1f1.5f1e10f、および123.456Fすべてのタイプのものですfloat
  • 本当のリテラルはサフィックスDまたはd型ですdouble。例えば、リテラル1d1.5d1e10d、および123.456Dすべてのタイプのものですdouble
  • 本当のリテラルはサフィックスMまたはm型ですdecimal。例えば、リテラル1m1.5m1e10m、および123.456Mすべてのタイプのものですdecimal。このリテラルは、正確な値を取り、必要に応じて銀行の丸めを使用して最も近い表現可能な値に丸めることにより、10進値に変換されます(セクション4.1.7)。値が丸められるか、値がゼロ(後者の場合、符号とスケールが0になる)でない限り、リテラルで明らかなスケールは保持されます。したがって、リテラル2.900mは解析され、符号0、係数2900、およびスケールを持つ10進数が形成され3ます。

9

変数がまだ短い場合は、明示的にキャストする必要があります。

Object s = (Int16) 1;

5
補足:ボクシング変換が発生すると思います。
3Dave、2014年

6
Int16は値型であり、Objectは参照型であるため、ボクシングが発生します。
Scott Marcus 14

3

短いものはありません。だけを使用してくださいshort s = 1;


2
興味深いことに、これはコンパイルされますがshort z1 = (0 == 1 ? 0 : 1); 、これは行われません:(short y = 1; short z2 = (0 == 1 ? 0 : y);申し訳ありませんが、コメントに改行を入れることはできません)
yoyo

3
@yoyo:0ifブランチ内のがへの代入int 前にに変換されるためz2です。shortブランチで2つのを使用すると、結果は再びになりますshort。if / elseを使用すると、コンパイラは、intがとして表されることを認識できませんshort
オリバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.