2012-05-01 298 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的解释吗?很高兴接受它,但不认为期待解释是不合理的...... –

相关问题