def _signed_bounds(self):
nsplit = self._nsplit()<EOL>if len(nsplit) == <NUM_LIT:1>:<EOL><INDENT>lb = nsplit[<NUM_LIT:0>].lower_bound<EOL>ub = nsplit[<NUM_LIT:0>].upper_bound<EOL>lb = self._unsigned_to_signed(lb, self.bits)<EOL>ub = self._unsigned_to_signed(ub, self.bits)<EOL>return [(lb, ub)]<EOL><DEDENT>elif len(nsplit) == <NUM_LIT:2>:<EOL><INDENT>lb_1 = nsplit[<NUM_LIT:0>].lower_bound<EOL>ub_1 = nsplit[<NUM_LIT:0>].upper_bound<EOL>lb_2 = nsplit[<NUM_LIT:1>].lower_bound<EOL>ub_2 = nsplit[<NUM_LIT:1>].upper_bound<EOL>lb_2 = self._unsigned_to_signed(lb_2, self.bits)<EOL>ub_2 = self._unsigned_to_signed(ub_2, self.bits)<EOL>return [ (lb_1, ub_1), (lb_2, ub_2) ]<EOL><DEDENT>else:<EOL><INDENT>raise Exception('<STR_LIT>')<EOL><DEDENT>
Get lower bound and upper bound for `self` in signed arithmetic.

:return: a list of (lower_bound, upper_bound) tuples