奇数行为C#vs Python字节运算

奇数行为C#vs Python字节运算,c#,python,C#,Python,为什么C#: 而Python: vals = array.array('B', [223, 30, 244, 156]) result = 0 for val in vals: result <<= 8 result |= val print 'RESULT: %s' % result 而。。。正在抛出以下数组值: [37, 120, 244, 167] 两种语言的收益率: RESULT: 628683943 EDIT:我在最初的问题中没有包括这一点,但我的实际目标是让

为什么C#:

而Python:

vals = array.array('B', [223, 30, 244, 156])
result = 0
for val in vals:
  result <<= 8
  result |= val
print 'RESULT: %s' % result
而。。。正在抛出以下数组值:

[37, 120, 244, 167]
两种语言的收益率:

RESULT: 628683943
EDIT:我在最初的问题中没有包括这一点,但我的实际目标是让Python在本例中表现得像C#。根据下面的答案,我发现我需要在Python端强制int溢出。

这似乎有效:

import numpy
result = numpy.int32(result)
看起来C#使用的是32位int,所以3743347868是-551619428 在这个问题上,无符号int应该使C#的行为更像python。

在C#
中,int
是一个有符号的32位整数。
int
的最大值为
2147483647
——低于
3743347868
。您执行的操作会导致溢出,从而导致负值

如果将
result
的类型更改为无符号int(
uint
)或64位整数(
long
),C代码将给出与Python相同的结果:

byte[]vals=新字节[]{223,30,244,156};
uint结果=0;

对于(inti=0;i,这个计算器告诉一切

左侧以int 64显示结果(使用无符号int 32时将显示相同的结果)。而右侧使用int 32。由于顶部位用于负数,因此将显示不同的数字

请注意,所有位都是相同的。这只是有符号整数和无符号整数之间的差异

[37, 120, 244, 167]
RESULT: 628683943
import numpy
result = numpy.int32(result)
byte[] vals = new byte[] {223, 30, 244, 156};
uint result = 0;
for(int i = 0; i <= 3; ++i) {
  result <<= 8;
  result |= vals[i];
}