检查python中的整数溢出

新手上路,请多包涵
class Solution(object):
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        negative = False
        if(x < 0):
            x = x * -1
            negative = True
        else:
            x = x
        sum = 0
        dig = 1
        strX = str(x)
        lst = list(strX)
        for i in lst:
            sum += int(i) * dig
            dig *= 10

        if(abs(sum) > 2 ** 32):
            return 0
        elif(negative == True):
            return sum * -1
        else:
            return sum

这是一个要求我们反转整数的 leetcode 问题。我知道这是一个脏代码,但它仍然有效,但当反转整数溢出时它不会返回 0。我试着在线检查

        if(abs(sum) > 2 ** 32):
            return 0

但是其中一个测试用例给了我:

 Input: 1563847412


 Output: 2147483651


 Expected: 0

首先,我不确定为什么会溢出,我也不确定如何解决这个问题。

谢谢!

原文由 Dukakus17 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 359
2 个回答

if(abs(sum) > 2 ** 32): 更改为 if(abs(sum) > (2 ** 31 - 1)):abs(sum) > (1 << 31) - 1): 最大的 32 位带符号整数实际上不是 2^1 (2^321) 而是 (2)。因为我们需要 保留一位作为符号位。

在这里 阅读为什么数字 2,147,483,647(或十六进制 7FFF,FFFF)是 32 位有符号二进制整数的最大正值

原文由 OLIVER.KOO 发布,翻译遵循 CC BY-SA 3.0 许可协议

我想像下面这样的一些轻量级的东西也许可以实现相同的逻辑,对于其他人来说,反转 32 位 int 后的主要溢出检查是

if(abs(n) > (2 ** 31 - 1)):
                    return 0

完整代码如下

def reverse(self, x):

            neg = False
            if x < 0:
                neg = True
                x = x * -1

            s = str(x)[::-1]
            n = int(s)
            if neg:
                n = n*-1
            if(abs(n) > (2 ** 31 - 1)):
                return 0
            return n

原文由 varun 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏