關於System.Convert.ToInt16(float value)拋異常System.OverflowException---值對於 Int32 太大或太小的原因的探究


前面有個案例最終查明原因是System.Convert.ToInt16的調用導致溢出異常:

0:000> !PrintException /d 4ee2e8f4
Exception object: 4ee2e8f4
Exception type:   System.OverflowException
Message:          值對於 Int32 太大或太小
InnerException:   <none>
StackTrace (generated):
    SP       IP       Function
    001EC094 1D3D8831 mscorlib_ni!System.Convert.ToInt32(Double)+0xc4bc19
當時核對了代碼,代碼里明明調用的是System.Convert.ToInt16(float value),為什么這里卻拋出異常是調用System.Convert.ToInt32(Double)引起的呢。

要想查明原因,只有查看源代碼。那我們看看DotNet48RTM的源代碼:

在工程mscorlib的代碼..\DotNet48RTM\Source\ndp\clr\src\BCL\system\convert.cs我們可以找到相關代碼

public static short ToInt16(float value) {
            return ToInt16((double)value);
        }

可知ToInt16(float value)調用的是ToInt16(double value) ,那么ToInt16(double value) 的代碼如下:

public static short ToInt16(double value) {
            return ToInt16(ToInt32(value));
        }

可知ToInt16(double value)調用的是ToInt32(double value),ToInt32(double value)的代碼如下:

 public static int ToInt32(double value) {
            if (value >= 0) {
                if (value < 2147483647.5) {
                    int result = (int)value;
                    double dif = value - result;
                    if (dif > 0.5 || dif == 0.5 && (result & 1) != 0) result++;
                    return result;
                }
            }
            else {
                if (value >= -2147483648.5) {
                    int result = (int)value;
                    double dif = value - result;
                    if (dif < -0.5 || dif == -0.5 && (result & 1) != 0) result--;
                    return result;
                }
            }
            throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
        }

此時,我們也就明白了為什么拋出的是“值對於 Int32 太大或太小”的異常了,同時,我也比較擔憂着個性能的問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM