C#短整型/长整型/整型字面量格式是什么?

277

在C/C#/等语言中,您可以告诉编译器一个字面量数字不是它看起来的类型(例如,float 而不是 doubleunsigned long 而不是 int):

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

有人能给我指出这些的列表吗?我特别是在寻找一个用于shortInt16的后缀。


1
请参见此处:https://dev59.com/fnVC5IYBdhLWcg3w1E_w - fixagon
可能是在C#中定义不同类型的数字的重复问题。 - Daniel Renshaw
5个回答

442
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的字面量说明符。


24
这是否意味着在使用short/ushort/byte/sbyte时,您必须对每个变量进行强制转换?例如:somebyte = somebool ? (byte) 1 : (byte) 0; - mola
5
@mola,是的,除非所需类型明确无误(例如byte b = 42;)。 - Thomas Levesque
3
@mola somebyte = (byte)(somebool ? 1 : 0); - or hor
5
需要翻译的内容:Just to add that upper case and lower case of these literal suffixes are equivalent e.g. 1l and 1L both will be treated as long integer but certainly 1L is more readable than 1l.翻译后的结果:这里需要补充一点,这些字面量后缀的大小写是等价的,例如 1l1L 都将被视为长整型,但显然 1L1l 更易读。 - RBT
2
@DzmitryLahoda 你是什么意思?那个问题中讨论的后缀尚未实现。 - Thomas Levesque
显示剩余2条评论

54

整数字面量

整数字面量的类型确定如下:

  • 如果字面量没有后缀,则将其值表示为以下类型中的第一个:intuintlongulong
  • 如果字面量被后缀 Uu,则将其值表示为以下类型中的第一个:uintulong
  • 如果字面量被后缀 Ll,则将其值表示为以下类型中的第一个:longulong
  • 如果字面量被后缀 ULUluLulLULulUlu,则其类型为 ulong

实数字面量

如果实数字面量没有指定实数类型后缀,则其类型为 double。否则,实数类型后缀决定实数字面量的类型,如下所示:

  • 被后缀 Ff 的实数字面量是 float 类型。例如,字面量 1f1.5f1e10f123.456F 都是 float 类型。
  • Dd结尾的实数字面量属于double类型。例如,字面量1d1.5d1e10d123.456D都是double类型。
  • Mm结尾的实数字面量属于decimal类型。例如,字面量1m1.5m1e10m123.456M都是decimal类型。该字面量通过采用精确值并在必要时使用银行家舍入(第4.1.7节)到最接近的可表示值来转换为十进制值。除非该值被舍入或者该值为零(此时符号和刻度将为0),否则任何明显的刻度都将保留。因此,字面量2.900m将被解析为带有符号0、系数2900和刻度3的十进制数。

  • 10

    如果您的变量不是short类型,您必须显式地进行强制类型转换:

    Object s = (Int16) 1;
    

    9
    附注:我认为这会导致一个强制类型转换。 - 3Dave
    9
    这会引起拳击问题,因为Int16是值类型而Object是引用类型。 - Scott Marcus

    6

    短整型没有简称,只需使用short s = 1;


    2
    有趣的是这个可以编译通过:short z1 = (0 == 1 ? 0 : 1);但是这个不行:short y = 1; short z2 = (0 == 1 ? 0 : y);(抱歉,注释中不允许换行) - yoyo
    4
    这是因为在赋值给z2之前,if语句中的0会被转换为int。如果你在两个分支中使用两个short,那么结果也将是一个short。在使用if/else语句时,编译器无法知道你的int可以表示为short - Oliver

    1
    var myValue = unchecked((short)0x7F00);
    

    字面值为int类型,因此必须转换为目标类型。 如果发生值溢出,则需要进行未经检查的操作。


    这是原问题的答案。 - Gerzson

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接