QT不清楚移位 - 操作员行为

时间:2016-03-17 07:22:32

标签: c++ qt bit-shift

我需要从数组中的一个字节获得2个高位。我有枚举,它定义了这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)
...

data[3] == 0返回0时,data[3] == 64返回1时,data[3] == 192返回-1data[3] == 128它返回-2

为什么会发生?

2 个答案:

答案 0 :(得分:2)

QByteArraychar的数组,很可能已签名。因此192超出char的范围并回到-64

当你return (elems)(data[3] >> 6)它会像签名类型上的大多数编译器实现一样arithmetic shift(因为right shift in C++ is implementation defined)。这会将符号位(在本例中为1,因为-64)传播到左侧,使得字节1中的所有位都是您返回-1的原因。

如果您只想要2个高位,则在返回

之前屏蔽结果
return (elems)((data[3] >> 6) & 0x03);

或者将类型转换为无符号

return (elems)((qint8)data[3] >> 6);

或者这也可以

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

答案 1 :(得分:1)

LưuVĩnhPhúc是对的。您还可以将您的功能修改为:

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