C#short/long/int文字格式?

3Da*_*ave 163 c# literals language-specifications

在C/C#/等中,你可以告诉编译器一个字面数字不是它看起来的样子(即float代替double,unsigned long而不是int:

var d = 1.0; // double
var f = 1.0f; // float
var u = 1UL; // unsigned long
Run Code Online (Sandbox Code Playgroud)

等等

有人能指出我这些的清单吗?我特意为short或寻找后缀Int16.

Tho*_*que 278

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
Run Code Online (Sandbox Code Playgroud)

我认为这就是...短/ ushort/byte/sbyte没有文字说明符

  • 这是否意味着你必须在任何地方使用short/ushort/byte/sbyte?例如:somebyte = somebool?(字节)1:(字节)0; (6认同)
  • @mola,是的,除非所需的类型是明确的(例如`byte b = 42;`) (3认同)
  • @mola`bybyte =(byte)(somebool?1:0);` (2认同)
  • 只是添加这些文字后缀的大写和小写是等效的,例如`1l`和`1L`都将被视为长整数,但肯定`1L`比`1l`更具可读性。 (2认同)
  • @DzmitryLahoda 你是什么意思?该问题中讨论的后缀尚未实现。 (2认同)

Bol*_*ock 40

来自§2.4.4.2整数文字:

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

  • 如果文字没有后缀,它具有第一这些类型的,其中它的值可以表示的:int,uint,long,ulong.
  • 如果文字后缀为Uu,则它具有这些类型中的第一个,其值可以表示为:uint,ulong.
  • 如果文字后缀为Ll,则它具有这些类型中的第一个,其值可以表示为:long,ulong.
  • 如果文字是由后缀UL,Ul,uL,ul,LU,Lu,lU,或lu,它的类型的ulong.

§2.4.4.3真正的文字:

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

  • 真实的文字后缀Ff类型float.例如,文字1f,1.5f,1e10f,和123.456F都是类型的float.
  • 真实的文字后缀Dd类型double.例如,文字1d,1.5d,1e10d,和123.456D都是类型的double.
  • 真实的文字后缀Mm类型decimal.例如,文字1m,1.5m,1e10m,和123.456M都是类型的decimal.通过获取精确值将此文字转换为十进制值,并在必要时使用银行家的舍入舍入到最接近的可表示值(第4.1.7节).除非值被舍入或值为零(在后一种情况下,符号和比例将为0),否则将保留文字中明显的任何比例.因此,2.900m将解析文字以形成带符号0,系数2900和比例的小数3.


Chr*_*ris 9

如果你的变量不是很短,你必须明确地转换它:

Object s = (Int16) 1;
Run Code Online (Sandbox Code Playgroud)

  • 它确实导致装箱,因为Int16是值类型而Object是引用类型. (4认同)
  • 旁注:我认为这会导致拳击转换. (3认同)

Ran*_*832 6

没有一个可以简称。只需使用short s = 1;.

  • @yoyo:那是因为 if 分支中的“0”在赋值给“z2”之前被转换为“int”。如果您在分支中使用两个“short”,结果将再次是“short”。使用 if/else,编译器无法知道您的“int”是否可以表示为“short”。 (4认同)
  • 有趣的是,它可以编译:`short z1 = (0 == 1 ? 0 : 1);` 但它不会:`short y = 1; Short z2 = (0 == 1 ? 0 : y);`(抱歉,注释中不允许换行) (2认同)