如何修复整数溢出?

0 投票
2 回答
791 浏览
提问于 2025-04-17 20:18

我有一段Python代码,它使用了一个数字2637268776(这个数字在32位系统中比sys.maxint还大)。所以它被保存为long类型。

我在代码中使用了C++的框架绑定,因此在某些情况下,它会被转换成int32,这就导致了int32溢出的问题:

2637268776 --> -1657698520

在我的情况下,这种情况只会发生一次,所以可以安全地假设如果这个整数是负数,那就是发生了一次int溢出。我该如何在数学上反转这些数字呢?

2 个回答

5

简单来说,你是做不到的。有很多长整型数字会映射到同一个负数。在你的例子中,比如2637268776L、6932236072L、11227203368L、15522170664L、19817137960L等等,它们都是这样的。

另外,发生这种溢出时,也有可能得到一个数。例如,4294967297L会映射到1。

2

你可以在这个值上加上 2 * (sys.maxint + 1)

>>> -1657698520 + (2 * (sys.maxint + 1))
2637268776L

不过,这样做只适用于原始值小于 2 * (sys.maxint + 1) 的情况,因为如果超过这个范围,就会出现溢出,变成正数,或者更糟糕的是,又会再次溢出。

撰写回答