2012-03-16 3 views
1

그래서이 센서는 부호가있는 두 바이트 (최고 및 최저)를 반환하여 -500-500 사이의 부호있는 값을 반환합니다. 어떻게하면 실제 가치가 무엇인지 알아낼 수 있습니까? 나는 2의 보수를해야한다는 것을 알고 있지만 어떻게 확신 할 수는 없다. 이것은 내가 지금 가지고있는 것입니다. -2 개의 16 비트 부호있는 바이트에서 부호있는 정수 가져 오기?

real_velocity = temp.values[0]; 
    if(temp.values[1] != -1) 
     real_velocity += temp.values[1]; 

    //if high byte > 1, negative number - take 2's compliment 
    if(temp.values[1] > 1) { 
     real_velocity = ~real_velocity; 
     real_velocity += 1; 
    } 

그러나 긍정적 인 것의 음수 값을 반환합니다. 예를 들어 -200은 바이트 255 (높음)와 56 (낮음)을 반환합니다. 311이 추가되었습니다. 위의 코드를 실행하면 -311이 나옵니다. 어떤 도움을 주셔서 감사합니다. 두 바이트를 0xFF와 0x38로를 얻고

+1

언어를 지정 (먼저 검색)하십시오. –

+0

나는 수색했지만, 나는 단지 약 1 바이트 만 찾았고 둘을 결합시키지 않았다. – Sterling

+0

제목은 16 비트 바이트를 나타내지 만 텍스트는 8 비트 바이트를 의미합니다. 무엇 이니? –

답변

4
-200 in hex is 0xFF38, 

, 하는 이들을 다시 변환하는 당신이 그 (것)들에게

0xFF = 255, 
0x38 = 56 

당신이 서명 바이트를 반환하지 않습니다 센서 만이 단순히 높은 인식 할 수 진수로 부호있는 16 비트 번호의 하위 바이트

그래서 당신의 결과는 16 비트 부호있는 변수 인

value = (highbyte << 8) + lowbyte 

값입니다.

0
real_velocity = temp.values[0]; 
real_velocity = real_velocity << 8; 
real_velocity |= temp.values[1]; 
// And, assuming 32-bit integers 
real_velocity <<= 16; 
real_velocity >>= 16; 
0

8 비트 바이트를 들어, 첫 번째 단지 unsigned로 변환 : 즉 16 비트 2의 보수의 상한 범위보다 큰 경우

typedef unsigned char Byte; 
unsigned const u = (Byte(temp.values[1]) << 8) | Byte(temp.values[0]); 

그런 다음, 2 16을 빼기 :

int const i = int(u >= (1u << 15)? u - (1u << 16) : u); 

비트 수준에서 트릭을 할 수는 있지만 그 점에 대해서는 아무 것도 없을 것이라고 생각합니다.

위의 내용은 CHAR_BIT = 8이라고 가정하면 그 unsigned은 16 비트 이상이고 기계와 원하는 결과는 2의 보수입니다. 당신이 준 예를 바탕으로


#include <iostream> 
using namespace std; 

int main() 
{ 
    typedef unsigned char Byte; 
    struct { char values[2]; } const temp = { 56, 255 }; 

    unsigned const u = (Byte(temp.values[1]) << 8) | Byte(temp.values[0]); 
    int const  i = int(u >= (1u << 15)? u - (1u << 16) : u); 

    cout << i << endl; 
} 
2

,이 값이 이미 2의 보수 않은 것 같습니다. 상위 바이트를 8 비트 왼쪽으로 이동하고 값을 OR로 이동하면됩니다.

real_velocity = (short) (temp.values[0] | (temp.values[1] << 8)); 
0

비트를 이동하고 값을 마스크 할 수 있습니다.

int main() 
{ 
    char data[2]; 
    data[0] = 0xFF; //high 
    data[1] = 56; //low 
    int value = 0; 

    if (data[0] & 0x80) //sign 
     value = 0xFFFF8000; 

    value |= ((data[0] & 0x7F) << 8) | data[1]; 

    std::cout<<std::hex<<value<<std::endl; 
    std::cout<<std::dec<<value<<std::endl; 
    std::cin.get(); 
} 

출력 :

ffffff38

-200

+0

여분의 마스킹이 필요하지 않습니다.상위 값을 unsigned char로 unsigned short로 비트 시프트 한 다음 낮은 값을 unsigned char로 OR 변환 한 다음 결과를 'signed short'로 재 해석하면 결과는 부호가 -200입니다. –

관련 문제