checking integer overflow in python

后端 未结 6 624
故里飘歌
故里飘歌 2021-02-05 08:01
class Solution(object):
    def reverse(self, x):
        \"\"\"
        :type x: int
        :rtype: int
        \"\"\"
        negative = False
        if(x < 0):
          


        
相关标签:
6条回答
  • 2021-02-05 08:07

    I guess some thing light weight like below could perhaps achieve the same logic, For someone else looking , the main overflow check after reversed 32 bit int is

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

    Full code below

    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
    
    0 讨论(0)
  • 2021-02-05 08:07
    if sum > ((1 << 31) - 1):
        return 0
    else:
        if negative == True:
          sum = -sum
          return sum
    
    0 讨论(0)
  • 2021-02-05 08:16

    change if(abs(sum) > 2 ** 32): to if(abs(sum) > (2 ** 31 - 1)): or abs(sum) > (1 << 31) - 1): The largest 32 bit signed interger is actually not 2^32 but (2 ^ (31)) -1). because we need one bit reserve as the sign bit.

    Read about it here of why The number 2,147,483,647 (or hexadecimal 7FFF,FFFF) is the maximum positive value for a 32-bit signed binary integer

    0 讨论(0)
  • 2021-02-05 08:16

    you can simply use:

    if sum >= pow(2,31)-1:
         return 0
    
    0 讨论(0)
  • 2021-02-05 08:23

    The largest 32-bit signed integer is (1 << 31) - 1 which is (2**31)-1 but not (2**32).

    Try This way :

    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)
    

    Output :

    0
    
    0 讨论(0)
  • 2021-02-05 08:31
    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)
    
    0 讨论(0)
提交回复
热议问题