code: def _signed_bounds(self):
          
  
          nsplit = self._nsplit()
          if len(nsplit) == 1:
              lb = nsplit[0].lower_bound
              ub = nsplit[0].upper_bound
  
              lb = self._unsigned_to_signed(lb, self.bits)
              ub = self._unsigned_to_signed(ub, self.bits)
  
              return [(lb, ub)]
  
          elif len(nsplit) == 2:
              # nsplit[0] is on the left hemisphere, and nsplit[1] is on the right hemisphere
  
              # The left one
              lb_1 = nsplit[0].lower_bound
              ub_1 = nsplit[0].upper_bound
  
              # The right one
              lb_2 = nsplit[1].lower_bound
              ub_2 = nsplit[1].upper_bound
              # Then convert them to negative numbers
              lb_2 = self._unsigned_to_signed(lb_2, self.bits)
              ub_2 = self._unsigned_to_signed(ub_2, self.bits)
  
              return [ (lb_1, ub_1), (lb_2, ub_2) ]
          else:
              raise Exception('WTF')
docs: Get lower bound and upper bound for `self` in signed arithmetic.
  
          :return: a list of (lower_bound, upper_bound) tuples