2012-03-16 202 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。感谢您的任何帮助。

+1

请指定语言(和搜索第一)。 – 2012-03-16 00:31:59

+0

我已经搜索,但我只找到约1个字节的东西,而不是两个组合。 – Sterling 2012-03-16 00:33:52

+0

标题说16位字节,但文本暗示8位字节。这是什么? – 2012-03-16 00:35:23

回答

4
-200 in hex is 0xFF38, 

你得到两个字节0xFF和0x38, 将这些回十进制你可能认识他们

0xFF = 255, 
0x38 = 56 

你的传感器没有返回2个符号字节,但是一个简单的高和一个有符号的16位数的低字节。

所以你的结果是

value = (highbyte << 8) + lowbyte 

值是16位有符号变量。

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

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

然后,如果比所述上限为16位二进制补码值,减去2 :

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

你可以在比特级别做技巧,但我不认为这有什么意义。

以上假设CHAR_BIT = 8,unsigned大于16位,并且机器和期望的结果是二进制补码。


#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位,并将这些值相加即可。

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作为unsigned char,然后将结果重新解释为signed short,结果是签了-200。 – 2012-03-16 01:28:57

相关问题