为什么在C#和C++中输出不同?

ain*_*ins 3 c# c++

在C#中

var buffer = new byte[] {71, 20, 0, 0, 9, 0, 0, 0};

var g = (ulong) ((uint) (buffer[0] | buffer[1] << 8 | buffer[2] << 16 | buffer[3] << 24) |
                    (long) (buffer[4] | buffer[5] << 8 | buffer[6] << 16 | buffer[7] << 24) << 32);
Run Code Online (Sandbox Code Playgroud)

在C++中

#define byte unsigned char
#define uint unsigned int
#define ulong unsigned long long

byte buffer[8] = {71, 20, 0, 0, 9, 0, 0, 0};

ulong g = (ulong) ((uint) (buffer[0] | buffer[1] << 8 | buffer[2] << 16 | buffer[3] << 24) |
                    (long) (buffer[4] | buffer[5] << 8 | buffer[6] << 16 | buffer[7] << 24) << 32);
Run Code Online (Sandbox Code Playgroud)

C#输出38654710855,C++输出5199.

为什么?几个小时以来我一直在摸不着头脑......

编辑:C#具有正确的输出.

感谢大家的帮助:)杰克艾德利的答案是第一个,所以我会将其标记为已接受的答案.其他答案也是正确的,但我不能接受多个答案:

Jac*_*ley 6

C++没有工作,因为你long在大多数当前的C++实现中转换为通常为32位但其确切长度留给实现者.你想要的long long.

另外,请阅读下面的Bikeshedder更完整的答案.他是非常正确的,固定大小的typedef是一种更可靠的方法.