2015-02-24 87 views
1

我想將Int32值轉換爲Int16值。投射時丟失的數據對我來說不成問題。但System.OverflowException表示Int16類型值太大或太小。無法將int32轉換爲int16。 Int16類型值太大或太小

Dim num As Int32 = &HFFFFFFF 
Dim num2 As Int16 = Convert.ToInt16(num) 
Debug.WriteLine(num.ToString("X4")) 
Debug.WriteLine(num2.ToString("X4")) 

如果我想投一個Int32 & HFFFFFFF到& HFFFF所以我應該怎麼辦。

任何幫助,將不勝感激。

+2

我修復了你的標籤--OverflowException和StackOverflowException是非常不同的。 – 2015-02-24 07:21:03

+0

因爲你的int32值大於Int16.MaxValue或小於Int16.MinValue,你會得到overflowException錯誤。 – 2015-02-24 07:35:33

+0

IMO如果我必須在鑄造前檢查限制或使用try..catch,它將不會很好,因爲代碼會更長。 – 2015-02-24 07:42:37

回答

1

我認爲,正如我在我的評論中所說的那樣,你的投射是無效的,因爲int16有maxValueMinValue,你的int32明顯不在兩者之間。

嘗試以下,看看你的錯誤更清楚:

Debug.WriteLine(Int16.MaxValue.ToString) 
Debug.WriteLine(Int16.MinValue.ToString) 
Debug.WriteLine(num.ToString) 

enter image description here

你最好的解決辦法是修整最後4 F關閉您INT32每當轉換,如果你仍然堅持這樣做:

Sub Main() 
     Dim num As Int32 = &HFFFFFFF 
     Dim num2 As Int16 = Convert.ToInt16(num.ToString("X8").Substring(num.ToString("X8").Length - 4, 4), 16) 
     Debug.WriteLine(num.ToString("X4")) 
     Debug.WriteLine(num2.ToString("X4")) 
     Console.ReadLine() 
    End Sub 
+0

'自從ToString打印出'FFFFFFF'和'68DB'默認情況下爲十進制字符串,'Remove'在這裏不太合理。 我正確的轉換爲'Dim num2 As Int16 = Convert.ToInt16(num.ToString(「X8」)。Substring(num.ToString(「X8」)。Length - 4,4),16)'它可以工作。 謝謝! – 2015-03-02 01:58:22

+0

我會接受你的答案,如果你能糾正它產生正確的輸出。 1+的信息 – 2015-03-02 02:01:18

+0

@QuangYen:你走了。 – 2015-03-02 14:37:24

1

如果你可以忽略OverflowException而橫跨整個鑄造和算術運算(包括被零除)您項目,我建議你設置編譯器選項/removeintchecks

設置/ removeintchecks在Visual Studio集成開發環境

  1. 有在Solution Explorer中選擇一個項目。在項目菜單上,單擊屬性。有關更多信息,請參閱Project Designer簡介。
  2. 單擊編譯選項卡。
  3. 單擊高級按鈕。
  4. 修改移除整數溢出複選框的值。

而且,Convert.ToInt16()仍然產生OverflowException不管選項。要從該選項中受益,您可以改用CTypeCShort

Dim num As Int32 = &HFFFFFFF 
Dim num2 As Int16 = CType(num, Int16) 
Debug.WriteLine(num.ToString("X4")) 
Debug.WriteLine(num2.ToString("X4")) 
相關問題