检查python中的整数溢出

时间:2017-08-06 04:51:38

标签: 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

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

谢谢!

6 个答案:

答案 0 :(得分:15)

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

了解原因here为什么数字2,147,483,647(或十六进制7FFF,FFFF)是32位有符号二进制整数的最大正值

答案 1 :(得分:2)

我猜有些像下面那样重量轻的东西也许可以实现相同的逻辑,对于其他人来说,反转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

答案 2 :(得分:1)

最大的32位有符号整数是(1 << 31) - 1(2**31)-1但不是(2**32)

尝试这种方式:

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) > ((1 << 31) - 1)): #use (1 << 31) - 1) instead of 2 ** 32
      return 0
    elif (negative == True):
      return sum * -1
    else:
      return sum

if __name__ == '__main__':
    x = 1563847412
    sol = Solution().reverse(x)
    print(sol)

输出

0

答案 3 :(得分:1)

class Solution:
    def reverse(self, x: int) -> int:

        split = [i for i in str(x)]
        split = split[::-1]
        final = ''

        
        if split[-1]=='-':
            final += '-'
            
            for i in split[0:-1]:
                print(i)
                final+=i
        else:
            
            for i in split[0:]:
                final+=i
                
        final = int(final)
        
        if(abs(final) > (2 ** 31 - 1)):
                return 0
                
        return(final)

答案 4 :(得分:0)

您可以简单地使用:

if sum >= pow(2,31)-1:
     return 0

答案 5 :(得分:0)

if sum > ((1 << 31) - 1):
    return 0
else:
    if negative == True:
      sum = -sum
      return sum