C#5.0显式数字转换描述正确吗?

C#5.0显式数字转换描述正确吗?,c#,explicit-conversion,C#,Explicit Conversion,从浮点和双精度到C#5.0规范(第6.2.1段)中描述的任何整数类型的显式数字转换如下: •对于从浮点型或双精度型到积分型的转换 处理取决于溢出检查上下文(§7.6.12),其中 转换发生在: o In a checked context, the conversion proceeds as follows: • If the value of the operand is NaN or infinite, a System.OverflowException is thrown.

从浮点和双精度到C#5.0规范(第6.2.1段)中描述的任何整数类型的显式数字转换如下:

•对于从浮点型或双精度型到积分型的转换 处理取决于溢出检查上下文(§7.6.12),其中 转换发生在:

  o In a checked context, the conversion proceeds as follows:
    • If the value of the operand is NaN or infinite, a System.OverflowException is thrown.
    • Otherwise, the source operand is rounded towards zero to the nearest integral value. 
      If this integral value is within the range of the destination type then 
      this value is the result of the conversion.
    • Otherwise, a System.OverflowException is thrown.
  o In an unchecked context, the conversion always succeeds, and proceeds as follows.
    • If the value of the operand is NaN or infinite, the result of the conversion is an unspecified value of the destination type.
    • Otherwise, the source operand is rounded towards zero to the nearest integral value.
      If this integral value is within the range of the destination type then
      this value is the result of the conversion.
    • Otherwise, the result of the conversion is an unspecified value of the destination type.
同时,中描述的相同转换的规则如下所示:

从双精度或浮点值转换为整型时 值被截断。如果得到的积分值超出 目标值的范围,结果取决于溢出 检查上下文。在选中的上下文中,OverflowException是 在未检查的上下文中抛出,结果是未指定的 目标类型的值

对这种转换进行评估,例如“(int)123.566”,我们得到“123”。 规范中给出的说明正确吗?

是的,正确

(很抱歉,这不是一个长而有保留的答案,但您没有要求任何其他内容。)

是的,是的

(很抱歉,这不是一个冗长的限定答案,但您没有要求任何其他内容。)

和中的描述都是正确的

默认情况下,C#表达式是未选中的
。再看一下粗体部分

  • 在未检查的上下文中,转换始终成功,并按如下方式进行。
    • 如果操作数的值为NaN或无穷大,则转换结果为目标类型的未指定值
    • 否则,源操作数将向零舍入为最接近的整数值。如果此整数值在目标类型的范围内,则此值是转换的结果
首先,让我们看看规格说明:

向零舍入到最接近的整数值

我们来分析一下,

正如我们所看到的,当我们向零取整时,结果将是123

第二,让我们看看MSDN所说的:

从双精度或浮点值转换为整型时 值被截断

从第页开始

在数学和计算机科学中,截断是 限制小数点右边的位数

请注意,在某些情况下,截断将产生与 舍入,但截断不会对数字进行上舍入或下舍入; 它仅在指定的数字处切断。

如我们所见,当我们也截断它时,结果将是
123

和中的描述都是正确的

默认情况下,C#表达式是未选中的
。再看一下粗体部分

  • 在未检查的上下文中,转换始终成功,并按如下方式进行。
    • 如果操作数的值为NaN或无穷大,则转换结果为目标类型的未指定值
    • 否则,源操作数将向零舍入为最接近的整数值。如果此整数值在目标类型的范围内,则此值是转换的结果
首先,让我们看看规格说明:

向零舍入到最接近的整数值

我们来分析一下,

正如我们所看到的,当我们向零取整时,结果将是123

第二,让我们看看MSDN所说的:

从双精度或浮点值转换为整型时 值被截断

从第页开始

在数学和计算机科学中,截断是 限制小数点右边的位数

请注意,在某些情况下,截断将产生与 舍入,但截断不会对数字进行上舍入或下舍入; 它仅在指定的数字处切断。


正如我们所看到的,当我们也截断它时,结果将是
123

您对什么感到困惑?您给出的示例与规范中描述的内容一致。123.566被四舍五入到123,在int的范围内,所以结果是int 123。我看到唯一可能引起混淆的是“向零舍入”和“截断”,但它们只是描述同一操作的两种不同方式。@Strilan,谢谢。我没有注意到“接近零”。你在困惑什么?您给出的示例与规范中描述的内容一致。123.566被四舍五入到123,在int的范围内,所以结果是int 123。我看到唯一可能引起混淆的是“向零舍入”和“截断”,但它们只是描述同一操作的两种不同方式。@Strilan,谢谢。我没有注意到“接近零”。我相信在C#中,表达式默认是未选中的。当然,您可以在IDE中更改这一点。在这种情况下,这并不重要,因为在未检查的上下文中,规范说“源操作数向零舍入到最接近的整数值。”@KrisVandermotten Yeap。我觉得我现在需要一杯咖啡。更新了我的答案。我相信在C#中,表达式默认是未选中的。当然,您可以在IDE中更改这一点。在这种情况下,这并不重要,因为在未检查的上下文中,规范说“源操作数向零舍入到最接近的整数值。”@KrisVandermotten Yeap。我觉得我现在需要一杯咖啡。更新了我的答案。