将double.NaN转换为int将得到0。
为什么将结果分配给变量与不分配给变量时结果会有所不同?
C#规范6.2.1中显示数字转换:
在checked上下文中,转换过程如下:
- 如果操作数的值为NaN或无穷大,则抛出System.OverflowException。 - 否则,源操作数向零舍入到最接近的整数值。如果该整数值在目标类型的范围内,则该值是转换的结果。 - 否则,抛出System.OverflowException。
在unchecked上下文中,转换总是成功,并按以下方式进行。
- 如果操作数的值为NaN或无穷大,则转换的结果是目标类型的未指定值。 - 否则,源操作数向零舍入到最接近的整数值。如果该整数值在目标类型的范围内,则该值是转换的结果。 - 否则,转换的结果是目标类型的未指定值。
环境:
- 编译器:Visual Studio 2013 - 运行时:.NET Framework 4.6.0 - 操作系统:Windows 10 Version 1607 - CPU:Intel Core i7 920
Windows:
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中显示数字转换:
在checked上下文中,转换过程如下:
- 如果操作数的值为NaN或无穷大,则抛出System.OverflowException。 - 否则,源操作数向零舍入到最接近的整数值。如果该整数值在目标类型的范围内,则该值是转换的结果。 - 否则,抛出System.OverflowException。
在unchecked上下文中,转换总是成功,并按以下方式进行。
- 如果操作数的值为NaN或无穷大,则转换的结果是目标类型的未指定值。 - 否则,源操作数向零舍入到最接近的整数值。如果该整数值在目标类型的范围内,则该值是转换的结果。 - 否则,转换的结果是目标类型的未指定值。
环境:
- 编译器:Visual Studio 2013 - 运行时:.NET Framework 4.6.0 - 操作系统:Windows 10 Version 1607 - CPU:Intel Core i7 920
Windows:
Console.WriteLine(Environment.OSVersion); // Microsoft Windows NT 6.2.9200.0
Console.WriteLine(Environment.Version); // 4.0.30319.42000
Console.WriteLine(unchecked((int)double.NaN));
输出-2147483648
。 - Matthew Watson0
。 - DaveShawint *c; printf("%d", *c);
会打印出 37 的未定义行为问题”。规范告诉你它将是某个未指定的数字。如果每次运行程序时都是不同的数字,你甚至不应该感到惊讶。 - itsme86