def _ssplit(self):
        """
        Split `self` at the south pole, which is the same as in unsigned arithmetic.
        When returning two StridedIntervals (which means a splitting occurred), it is guaranteed that the first
        StridedInterval is on the right side of the south pole.

        :return: a list of split StridedIntervals, that contains either one or two StridedIntervals
        """

        south_pole_right = self.max_int(self.bits) # 111...1
        # south_pole_left = 0

        # Is `self` straddling the south pole?
        if self.upper_bound < self.lower_bound:
            # It straddles the south pole!

            a_upper_bound = south_pole_right - ((south_pole_right - self.lower_bound) % self.stride)
            a = StridedInterval(bits=self.bits, stride=self.stride, lower_bound=self.lower_bound,
                                upper_bound=a_upper_bound, uninitialized=self.uninitialized)

            b_lower_bound = self._modular_add(a_upper_bound, self.stride, self.bits)
            b = StridedInterval(bits=self.bits, stride=self.stride, lower_bound=b_lower_bound,
                                upper_bound=self.upper_bound, uninitialized=self.uninitialized)

            return [ a, b ]

        else:
            return [ self.copy() ]
Split `self` at the south pole, which is the same as in unsigned arithmetic.
        When returning two StridedIntervals (which means a splitting occurred), it is guaranteed that the first
        StridedInterval is on the right side of the south pole.

        :return: a list of split StridedIntervals, that contains either one or two StridedIntervals