无符号长位移位

Mar*_*llo 8 c++ unsigned long-integer

我有位移和无符号长的问题.这是我的测试代码:

char header[4];
header[0] = 0x80;
header[1] = 0x00;
header[2] = 0x00;
header[3] = 0x00;

unsigned long l1 = 0x80000000UL;
unsigned long l2 = ((unsigned long) header[0] << 24) + ((unsigned long) header[1] << 16) + ((unsigned long) header[2] << 8) + (unsigned long) header[3];

cout << l1 << endl;
cout << l2 << endl;
Run Code Online (Sandbox Code Playgroud)

我希望l2也有2147483648的值,但它打印18446744071562067968.我假设第一个字节的位移会导致问题?

希望有人可以解释为什么这会失败以及我如何修改l2的计算以便它返回正确的值.

提前致谢.

cam*_*amh 5

存储在char中的0x80值是带符号的数量.当您将其转换为更宽的类型时,将对值进行扩展签名以保持与较大类型相同的值.

char将第一行中的类型更改为unsigned char,您将不会发生符号扩展.

要简化您的案例中发生的事情,请运行以下命令:

char c = 0x80
unsigned long l = c
cout << l << endl;
Run Code Online (Sandbox Code Playgroud)

你得到这个输出:

18446744073709551488
Run Code Online (Sandbox Code Playgroud)

-128为64位整数(0x80为-128为8位整数).