2012-05-01 300 views
0

我有一個16位有符號的數字從硬件進來。我想將它種成Int32如何在C#中將16位'short'轉換爲32位整數?

當我將它作爲short進行投射時,它偶爾會在數字爲負數時有效。但大多數情況下,我得到first chance exception of type 'System.OverflowException' occurred

這裏是我的代碼:

int M1; 
M1 = (short)(INBuffer[3] << 8) + INBuffer[2]; 

如何投出16位短於C#32位整數?

+1

什麼是INBuffer的類型?你能向我們展示它的聲明嗎? –

+6

如果你想獲得32位值,你爲什麼要選擇「short」? –

+0

這是一個猜測,這可能會被你對我上面的問題的回答所駁斥。如果'INBuffer'包含'short's,那麼左移不能產生'OverflowException'(C#中的移位運算符只是默默地丟棄掉結果末尾的所有位),但是加法可以;它可能例如試圖添加32000到32000.在這種情況下,你實際需要什麼行爲?如果你只想做C會做的事情並丟掉高位,你可以使用'unchecked'。如果沒有,那麼答案將取決於你*想要的東西。 –

回答

2

假設INBuffer是一個字節數組,您可以安全地將其轉換爲ushort而不是short。這是因爲如果高位字節的最高位爲1,那麼一旦它被移位,對於有符號的短位來說該值太大。

在你的情況,如果你想要一個int,沒必要投在所有 - 位移位輸出int,並增設了一個byte再次留下一個int - 你已經在那裏...

+0

[需要引用]。字節b = 0xff; var s =(short)b; –

+0

@Hans - 如果我明白你的觀點,那麼我可能沒有足夠清晰。我編輯了第一段的結尾。 –

+0

請問我有關於-1的解釋嗎?很高興接受它,但不認爲期待解釋是不合理的...... –

相關問題