如何修复整数溢出?
我有一段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)
的情况,因为如果超过这个范围,就会出现溢出,变成正数,或者更糟糕的是,又会再次溢出。