C++ 为什么在C++;bitshift不工作时从大端到int16?
我正在用Qt读取bytearray(2字节的big-endian)C++ 为什么在C++;bitshift不工作时从大端到int16?,c++,qt,endianness,bit-shift,C++,Qt,Endianness,Bit Shift,我正在用Qt读取bytearray(2字节的big-endian) QByteArray a = data.mid(cellNumber, 2); int16 res = qFromBigEndian<qint16>(a); 有人知道我做错了什么吗?位集取无符号长而QByteArray::operator[]返回char,有符号 你有积分提升,使负数成为大数(用1填充) 可能的解决办法 std::bitset<16> b0(static_cast<unsigned
QByteArray a = data.mid(cellNumber, 2);
int16 res = qFromBigEndian<qint16>(a);
有人知道我做错了什么吗?
位集
取无符号长
而QByteArray::operator[]
返回char
,有符号
你有积分提升,使负数成为大数(用1填充)
可能的解决办法
std::bitset<16> b0(static_cast<unsigned char>(a[0]));
std::bitset<16> b1(static_cast<unsigned char>(a[1]));
std::位集b0(静态_-cast(a[0]);
std::位集b1(静态_转换(a[1]);
谢谢大家
std::bitset<16> b0(static_cast<unsigned char>(a[cellNumber]));
std::bitset<16> b1(static_cast<unsigned char>(a[cellNumber + 1]));
std::bitset<16> resb = (b0 << 8) | (b1 << 0);
int16_t resi = int16_t(resb.to_ulong());
std::位集b0(静态_转换(一个[cellNumber]);
std::位集b1(静态_转换(a[cellNumber+1]);
std::位集resb=(b0QByteArray
的[]
运算符使用有符号的字符
,10101011
是负数,在负数上调用左移位未定义bahaviour@AlanBirtles除非使用C++20,对吗?@AlanBirtles:BTW,左移用于类,而不是有符号整数。我不认为使用类std::bitset
比qFromBigEndian
@Jarod42:你说得对,它不像QtQFromBigendian那样快!
std::bitset<16> b0(static_cast<unsigned char>(a[0]));
std::bitset<16> b1(static_cast<unsigned char>(a[1]));
std::bitset<16> b0(static_cast<unsigned char>(a[cellNumber]));
std::bitset<16> b1(static_cast<unsigned char>(a[cellNumber + 1]));
std::bitset<16> resb = (b0 << 8) | (b1 << 0);
int16_t resi = int16_t(resb.to_ulong());