c++ - QT 不清楚的移位运算符行为

标签 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 时它返回 -1 而当 data[3] == 128 时它返回-2

为什么会这样?

最佳答案

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

当您返回 (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);

关于c++ - QT 不清楚的移位运算符行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36053967/

相关文章:

c++ - QDataStream读取到QVector

c - 如何从 4 个字符的数组中获取一个 int?我不明白给我的答案

javascript - Javascript 中的 16 位二进制算术

c++ - 链接器返回 "relocation has an invalid symbol at symbol index..."

c++ - const 函数指针

c++ - 无法使用 vector::插入 "no instance of overloaded function..."

microcontroller - "swap nybble"和 "byte mask"技巧是否可以比使用移位链的简单方法更快地进行多字节逻辑移位 4

c++ - 子类真的继承私有(private)成员变量吗?

c++ - Qt SQLite 无法执行 Select 查询

c++ - 发布构建调试问题