2010-11-09 67 views
1

我有以下最低代碼:轉換對象的C++內置類型

using namespace System; 

long get_prop(Object^ v) 
{ 
    return Convert::ToInt32(v); 
} 

int main() 
{ 
    Object^ o1 = gcnew Int32(-1); 
    Object^ o2 = gcnew UInt32(0xFFFFFFFF); 
    long value1 = get_prop(o1); 
    long value2 = get_prop(o2); 

    return 0; 
} 

它給出了get_prop功能OverflowException例外。最後,我需要在純C++代碼中使用get_prop的結果。什麼是寫get_prop函數的正確方法,所以它在兩種情況下都可以毫無例外地工作。我可以像使用C++一樣使用某種模板嗎?還是有更簡單的解決方案?

回答

1

Hmya,你正試圖在一個31位捅捅32位豬。此代碼最終調用Convert :: ToInt32(UInt32值),如下所示:

public static int ToInt32(uint value) 
{ 
    if (value > 0x7fffffff) 
    { 
     throw new OverflowException(Environment.GetResourceString("Overflow_Int32")); 
    } 
    return (int) value; 
} 

Kaboom。不知道是什麼樣的,你要溢出的行爲,但是這讓編譯器做的忽略,避免了異常:

long get_prop(Object^ v) 
{ 
    return (long)Convert::ToInt64(v); 
} 
+0

'轉換:: ToInt64'會導致x64系統上同樣的問題,因爲我明白了嗎?至於溢出行爲,我需要保持原始值的位模式。 – 2010-11-09 18:32:16

+0

不,一個* long *在MS編譯器和Windows上仍然是32位。而且UInt32也不會改變。 – 2010-11-09 18:43:18

+0

有沒有像'static_cast'那樣處理溢出而不會產生異常? '(長)轉換:: ToInt64'看起來仍然不安全。 – 2010-11-09 18:53:44