奇数行为C#vs Python字节操作

2024-04-26 18:57:52 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么C#:

byte[] vals = new byte[] {223, 30, 244, 156};
int result = 0;
for(int i = 0; i <= 3; ++i) {
  result <<= 8;
  result |= vals[i];
}
print("RESULT: " + result);

产量:

RESULT: -551619428

而Python:

vals = array.array('B', [223, 30, 244, 156])
result = 0
for val in vals:
  result <<= 8
  result |= val
print 'RESULT: %s' % result

收益率:

RESULT: 3743347868

而。。。抛出数组值:

[37, 120, 244, 167]

在这两种语言中:

RESULT: 628683943

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

这似乎有效:

import numpy
result = numpy.int32(result)

Tags: innumpynewforval数组resultbyte
3条回答

这个计算器能告诉你一切。你知道吗

enter image description here

左侧以int 64显示结果(使用无符号int 32时将显示相同的结果)。而右侧使用int 32。因为上面的位是用来表示负数的,所以它会显示不同的数字。你知道吗

请注意,所有位都是相同的。这就是有符号整数和无符号整数的区别。你知道吗

在C语言中,int是一个有符号的32位整数。int的最大值是2147483647—这比3743347868低。执行的操作会导致溢出,从而导致负值。你知道吗

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

byte[] vals = new byte[] {223, 30, 244, 156};
uint result = 0;
for(int i = 0; i <= 3; ++i) {
  result <<= 8;
  result |= vals[i];
}

似乎C#使用的是32位int,所以3743347868是-551619428 在这个问题上,无符号int应该使C的行为更像python。你知道吗

相关问题 更多 >