C++ QT换档操纵员的行为

C++ QT换档操纵员的行为,c++,qt,bit-shift,C++,Qt,Bit Shift,我需要从数组中的一个字节中获取2个高位。我有enum,它定义了这2位的所有值: ... enum elems{ elem1 = 0, elem2 = 1, elem3 = 2, elem4 = 3 } ... elems getElems(const QByteArray &data) { return (elems)(data[3] >> 6); } ... qDebug() << (data[3] >> 6)

我需要从数组中的一个字节中获取2个高位。我有enum,它定义了这2位的所有值:

...
enum elems{
    elem1 = 0,
    elem2 = 1,
    elem3 = 2,
    elem4 = 3
}
...
elems getElems(const QByteArray &data)
{
    return (elems)(data[3] >> 6);
}
...
qDebug() << (data[3] >> 6); // return 0 or 1 or 2 or 3 (true way)
qDebug() << getElems(data); // return 0 or 1 or -1 or -2 (wrong way)
...
。。。
枚举元素{
elem1=0,
elem2=1,
elem3=2,
elem4=3
}
...
elems getElems(常量QByteArray和数据)
{
返回(元素)(数据[3]>>6);
}
...
qDebug()>6);//返回0或1或2或3(真实方式)

qDebug()
QByteArray
是字符的数组,它很可能是有符号的。因此192超出了char的范围,并返回到-64

当您
return(elems)(数据[3]>>6)
时,它将执行与大多数编译器对签名类型的实现类似的操作(因为)。这将把符号位(在本例中是1,因为-64)传播到左侧,使字节1中的所有位都成为1,这就是返回-1的原因

如果只需要2个高位,请在返回前屏蔽结果

return (elems)((data[3] >> 6) & 0x03);
或将类型强制转换为unsigned

return (elems)((qint8)data[3] >> 6);
或者,这也会起作用

return (elems)((data[3] >> 6) & 0xFF);

QByteArray
是指向
char
的数组,它很可能是有符号的。因此192超出了char的范围,并返回到-64

当您
return(elems)(数据[3]>>6)
时,它将执行与大多数编译器对签名类型的实现类似的操作(因为)。这将把符号位(在本例中是1,因为-64)传播到左侧,使字节1中的所有位都成为1,这就是返回-1的原因

如果只需要2个高位,请在返回前屏蔽结果

return (elems)((data[3] >> 6) & 0x03);
或将类型强制转换为unsigned

return (elems)((qint8)data[3] >> 6);
或者,这也会起作用

return (elems)((data[3] >> 6) & 0xFF);

Lưu Vĩnh Phúc是正确的。您还可以将函数修改为:

return (elems)((unsigned char)data[3] >> 6);

Lưu Vĩnh Phúc是正确的。您还可以将函数修改为:

return (elems)((unsigned char)data[3] >> 6);

没错。无符号类型上的右移总是逻辑移位。只有有符号类型上的移位可以是算术的,这是正确的。无符号类型上的右移总是逻辑移位。只有有符号类型上的移位可以是算术的