C#短/长/整数文字格式?


173

在C / C#等中,您可以告诉编译器文字数字不是它看起来的样子(即,float代替doubleunsigned long而不是int

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

等等

有人可以指出我的清单吗?我正在寻找short或的后缀Int16




谈论一连串的回应...为大家投票。
3Dave 2011年

Answers:


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


8
这是否意味着您必须在使用short / ushort / byte / sbyte的任何地方进行强制转换?例如:somebyte = somebool吗?(字节)1:(字节)0;
mola

3
@mola,是的,除非所需的类型是明确的(例如byte b = 42;
Thomas Levesque 2013年

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

2
只需补充一下,这些文字后缀的大写和小写是等效的,例如1l1L它们都将被视为长整数,但肯定1L比可读性强1l
RBT

1
@DzmitryLahoda是什么意思?该问题中讨论的后缀尚未实现。
托马斯·列维斯克

40

§2.4.4.2整数文字开始

整数文字的类型确定如下:

  • 如果文字没有后缀,它具有第一这些类型的,其中它的值可以表示的:intuintlongulong
  • 如果文字以U或作为后缀u,则具有可以表示其值的以下第一种类型:uintulong
  • 如果文字以L或作为后缀l,则具有可以表示其值的以下第一种类型:longulong
  • 如果文字是由后缀ULUluLulLULulU,或lu,它的类型的ulong

§2.4.4.3开始,实字面值

如果未指定实型后缀,则实数文字的类型为double。否则,实类型后缀将确定实文字的类型,如下所示:

  • 后缀为Ff类型的实数float。例如,文字1f1.5f1e10f,和123.456F都是类型的float
  • 后缀为Dd类型的实数double。例如,文字1d1.5d1e10d,和123.456D都是类型的double
  • 后缀为Mm类型的实数decimal。例如,文字1m1.5m1e10m,和123.456M都是类型的decimal。通过获取精确值,可以将该文字转换为十进制值,并在必要时使用银行取舍将其舍入为最接近的可表示值(第4.1.7节)。除非值四舍五入或值为零(在后一种情况下,符号和小数位将为0),否则保留字面上明显的小数位数。因此,文字2.900m将被解析为带sign 0,系数2900和scale的小数3

10

如果您的变量还不够短,则必须显式转换它:

Object s = (Int16) 1;

4
旁注:我认为这会导致拳击转换。
3Dave 2014年

5
确实会造成装箱,因为Int16是值类型,而Object是引用类型。
Scott Marcus 2014年

3

简而言之,没有一个。只需使用short s = 1;


2
有趣的是这个编译:short z1 = (0 == 1 ? 0 : 1); 但这并不:short y = 1; short z2 = (0 == 1 ? 0 : y);(对不起,不允许在评论没有断行)
YOYO

3
@yoyo:这是因为0if分支中的if 在分配给int 之前转换为z2。如果short在分支中使用两个,则结果将再次为short。使用if / else,编译器将无法知道您int可以表示为short
奥利弗·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.