我试图将字节数组转换为长整型
long readAndSkipLong(char*& b)
{
unsigned long ret = (b[0] << 56) | (b[1] << 48) | (b[2] << 40) | (b[3]<<32) | (b[4] << 24) | (b[5] << 16) | (b[6] << 8) | (b[7]);
return ret;
}
我的转移似乎不对。对于预期值
152 --> 00000000 00000000 00000000 00000000 00000000 00000000 00000000 10011000
我得到:
-104 --> 11111111 11111111 11111111 11111111 11111111 11111111 11111111 10011000
知道错误在哪里吗?
最佳答案
是因为类型提升和符号扩展。 char
中的每个值数组是有符号的,位移是整数运算。当您使用移位运算符时,它的计算结果为 int
,因为你的 char
s 是有符号的,移动它们会产生 signed int
最后(最右边)字节有 1
作为标志位。提升为 int
时, 它的值变为 -104
通过符号扩展。当您对其余数字进行或运算时,所有 1
位不受影响。
为避免此问题,您可以将每个 char
s 至 unsigned long
在移位和 ORing 之前。
您可以做的另一件事是按位与每个 char
与 0xff
喜欢((b[i] & 0xff) << 24)
. AND 与 0xff
会产生 int
, 保持最低有效 8 位不变,左侧为零,无符号扩展。
关于c++ - char 数组到 long 导致意外值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29172142/