Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在C++;bitshift不工作时从大端到int16?_C++_Qt_Endianness_Bit Shift - Fatal编程技术网

C++ 为什么在C++;bitshift不工作时从大端到int16?

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

我正在用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 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=(b0
QByteArray
[]
运算符使用有符号的
字符
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());