c# - 将 NaN 转换为 int 时,为什么值会根据是否分配给变量而变化?

标签 c#

将 double.NaN 转换为 int 将为 0。

Console.WriteLine(unchecked((int)double.NaN));    // 0

但是,将 double.NaN 赋给一个变量然后转换为 int 将是 -2147483648。

double value = double.NaN;
Console.WriteLine (unchecked ((int) value));    // -2147483648
Console.WriteLine ((int) value);                // -2147483648

为什么结果会根据是否分配给变量而改变?

C# 规范

6.2.1 显式数值转换

  • 在检查上下文中,转换过程如下:
    • 如果操作数的值为 NaN 或无穷大,则抛出 System.OverflowException。
    • 否则,源操作数向零舍入到最接近的整数值。如果这个整数值在目标类型的范围内,那么这个值就是转换的结果。
    • 否则,将抛出 System.OverflowException。
  • 在未检查的上下文中,转换总是成功的,并按如下方式进行。
    • 如果操作数的值为 NaN 或无穷大,则转换结果为目标类型的未指定值。
    • 否则,源操作数向零舍入到最接近的整数值。如果这个整数值在目标类型的范围内,那么这个值就是转换的结果。
    • 否则,转换的结果是目标类型的未指定值。

环境

  • 编译器:Visual Studio 2013
  • Rimtime:.NET Framework 4.6.0
  • 操作系统:Windows 10 版本 1607
  • 中央处理器:英特尔酷睿 i7 920

window :

Console.WriteLine(Environment.OSVersion);    // Microsoft Windows NT 6.2.9200.0
Console.WriteLine(Environment.Version);      // 4.0.30319.42000

最佳答案

默认情况下,控制台应用程序编译为未选中。这就是为什么您的最后一个示例显示的值与显式使用 unchecked 的示例相同。

对于您的其余示例,您引用的规范部分适用:

  • 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.

(由我强调)。

Unspecified 表示您不能依赖结果。它可以是 0-2147483648 或任何其他内容。

我想弄清楚在你的特殊情况下到底发生了什么,但两种方式我都得到 -2147483648。因此很难追踪。

关于c# - 将 NaN 转换为 int 时,为什么值会根据是否分配给变量而变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42536954/

相关文章:

c# - Elasticsearch ScrollId不返回任何文档

c# - Android 手机在 ASP.Net 站点回发后无法打开流式传输的 PDF

c# - 去方法声明的快捷键?

c# - C#获得YouTube视频的时长

c# - 如何向使用我的 Azure 云服务的客户计费?

c# - 如何获取特定ListView列的所有行中的值?

c# - 无法修复 "Could not create SSL/TLS secure channel"发出 web 请求

c# - 具有不同类型 : Cleaner, 非字符串方法名称的委托(delegate)的 Dictionary<T,Delegate>?

c# - mouseenter 和 mousehover 有什么区别?

c# - MySQL 查询多个表的搜索过滤器