QByteArray 到 Integer 的转换产生不正确的结果

QByteArray to Integer conversion produces incorrect results

我正在尝试将字节数组转换为整数:

QByteArray b = QByteArray::fromHex("00008000");
quint32 result = b[3];
result += b[2] << 8;
result += b[1] << 16;
result += b[0] << 24;

但我得到的是 4294934528 而不是 32768。这里有什么问题?

QByteArraychar 的数组。显然,您平台上的 char 已签名且为 8 位宽。因此,您的问题可以提炼为:

char c = 0x80;
quint32 = c << 8;

标准规定:

N4606 § 4.8 [conv.integral] / 3

If the destination type is signed, the value is unchanged if it can be represented in the destination type; otherwise, the value is implementation-defined.

在这种情况下(通常在 2 的补码系统上),0x80 映射到 std::numeric_limits<char>::min() == -128,这是合乎逻辑的,因为它们共享相同的底层位模式.

现在,-128 << 8定义为-128 * 28,即-32768。

最后,从 -32768 到 32 位无符号整数的转换定义明确并产生 4294934528