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
。这里有什么问题?
QByteArray
是 char
的数组。显然,您平台上的 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
我正在尝试将字节数组转换为整数:
QByteArray b = QByteArray::fromHex("00008000");
quint32 result = b[3];
result += b[2] << 8;
result += b[1] << 16;
result += b[0] << 24;
但我得到的是 4294934528
而不是 32768
。这里有什么问题?
QByteArray
是 char
的数组。显然,您平台上的 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