【发布时间】:2016-03-10 11:35:00
【问题描述】:
我有一段有趣的代码:
private static int ConvertToInt(dynamic value)
{
unchecked
{
return (int)value;
}
}
Console.WriteLine(ConvertToInt(long.MaxValue));
Console.WriteLine(ConvertToInt(double.MaxValue));
Console.WriteLine(ConvertToInt(decimal.MaxValue));
这个输出:
-1
-2147483648
System.OverflowException: Value was either too large or too small for an Int32.
我觉得这有点奇怪。为什么即使我明确指定了unchecked,从decimal 转换为int 也会引发OverflowException?
编辑:有趣。 MSDN page on checked/unchecked context 表示以下操作会受到溢出检查的影响:
整数类型之间的显式数字转换。
这里的关键字是intergal。来看看what types are considered intergal:
sbyte byte char short ushort int uint long ulong
所以decimal 的行为与int 不同是有道理的,但是double 是怎么回事?
【问题讨论】:
-
十进制与其他浮点数对象在二进制数的准确性和存储方面有所不同。详细解释here。
-
unchecked根本不影响十进制和双精度。这是标准行为。此外,这些都不依赖于动态。为了清楚起见,我建议将其删除。
标签: c# int double decimal long-integer