2012-05-01 3 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]; 

가 어떻게 C#에서 32 비트 정수에 16 비트의 short를 내느냐 : 여기

내 코드?

+1

'INBuffer'의 타입은 무엇입니까? 그 선언을 우리에게 보여줄 수 있습니까? –

+6

32 비트 값을 얻으 려한다면 왜 'short'로 변환할까요? –

+0

다음은 추측입니다. 위 질문에 대한 귀하의 답변에 의해 반박 될 수 있습니다. 'INBuffer'가'short's를 포함하면 왼쪽 시프트는'OverflowException'을 생성 할 수 없습니다 (C#의 시프트 연산자는 결과의 끝에서 벗어난 비트를 무시하고 무시합니다). 예를 들어 32000에서 32000을 추가하려고합니다.이 경우 실제로 어떤 행동이 필요합니까? C가 할 일을하고 높은 비트를 버리고 싶다면'unchecked '를 사용할 수 있습니다. 그렇지 않다면, 그 대답은 당신이 원하는 * 것에 달려 있습니다. –

답변

2

INBuffer이 바이트 배열 인 경우 이 아닌 ushort으로 안전하게 전송할 수 있습니다. 왜냐하면 상위 바이트의 최상위 비트가 1이면 비트 시프트 된 값이 부호있는 short에 비해 너무 큽니다. 비트 변화가 int를 출력하고, byte의 추가는 다시 int 잎 - - 당신이 int를 원하는 경우 귀하의 경우에는

은 필요가 전혀 캐스트 없습니다 당신은 이미 거기 ...

+0

[표창장 필요]. 바이트 b = 0xff; var s = (짧은) b; –

+0

@ 한스 - 당신의 요점을 이해한다면 아마도 제 생각에는 분명히 충분하지 않았을 것입니다. 첫 번째 단락의 끝 부분을 편집했습니다. –

+0

제발 -1에 대한 설명을 주시겠습니까? 그것을 받아 들일 수는 있지만, 설명을 기대하는 것은 무리라고 생각하지 마십시오 ... –

관련 문제