数字文字

时间:2016-01-06 16:26:33

标签: c# declaration literals variable-declaration

我是C#的新手,想要了解价值观是如何运作的。如果我查看一个正常的整数值,它有3个重要部分:类型,名称和值。

int testInt = 3;
 |    |       |
Type Name   Value

但是当我看到浮点值时,由于后缀F,它让我感到困惑。

float testFloat = 3.0F;
  |      |        |  |
 Type   Name  Value Type

现在有两种类型,如果没有F后缀,则值为double。但是,当我可以用

声明双变量时,为什么会发生这种情况
double testDouble = 3.0D;

double作为第一个单词应该足够了,不应该吗?带有后缀M的十进制值也是如此:

decimal testDecimal = 3.0M;

然后,当涉及到其他后缀时,它开始让我感到困惑:

ulong bigOne = 2985825802805280508UL;

之前我在测试中使用了ulong,并且知道u用于“无符号”,并且值为正常值的两倍。然后你再次得到U作为后缀,谷歌的文字就像谷歌说的那样。据我了解,“文字”是包含数字的值类型。但我不明白的是,即使没有后缀,为什么这个ulong也能正常工作?

ulong bigOne = 2985825802805280508;

然后我尝试了不同的东西来理解后缀的重要性

byte testLong = 12312UL;

这不起作用,因为字节(254)的值太高而且后缀不会将其转换为长变量。

为什么第一个单词(类型)不足以申报?第一个词应该足以告诉类型。最好的做法是始终为值赋予后缀吗?

3 个答案:

答案 0 :(得分:24)

你在这里混淆了两件不同的事情:

float testFloat = 3.0F;

float告诉编译器变量testFloat将是浮点值。 F告诉编译器文字 3.0float。编译器需要先了解这两个部分,然后才能决定是否可以使用无转换或隐式转换将字面值分配给变量。

例如,您可以这样做:

float testFloat = 3;

那没关系。因为编译器会将3视为一个文字整数,但它知道它可以将它分配给一个浮点而不会丢失精度(这是隐式转换)。但如果你这样做:

float testFloat = 3.0;

3.0是一个文字双(因为它是没有后缀的默认值)并且它不能隐式地(即自动地)将double转换为float,因为float的精度较低。换句话说,信息可能会丢失。所以你要么告诉编译器它是一个文字浮点数:

float testFloat = 3.0f;

或者你告诉它你可以通过使用显式强制转换来降低精度:

float testFloat = (float)3.0;

答案 1 :(得分:10)

所有 1 表达式都需要解析为一个类型。因此表达式42 总是需要完全一种类型(恰好是int)。如果您将其分配给int变量并且int分配给double,则它不能是double。使用表达式的上下文永远不会用 1 来确定它解析的类型。

这就是为什么数字文字可以有后缀;它是一种在该表达式中定义表达式的方式

请注意,许多数字类型之间也存在隐式转换,因此如果您编写double d = 42;,则表达式42 实际上是一个整数,但存在隐式正在对其执行的转换运算符将在赋值之前将其转换为double

1 这里有一些例外,例如lambdas,表达式的类型取决于它的使用方式和方法组;在真空中,这些表达没有类型。

答案 2 :(得分:2)

存在声明变量的其他方式,而不指定名称前面的类型:

var myNumber = 10;

在这种情况下,变量类型将由文字值定义。

如果使用类型(double | float | int | ...)而不是" var",编译器会将文字值转换为变量类型(如果可能的话)。

所以,我认为当你使用" var"时,后缀很重要。声明变量和文字值类型不是未使用后缀时的默认关联;

使用后缀太有用时还有另一个原因,例如您希望在表达式中进行隐式转换。