code: public IPv6Address subtract(int value)
      {
          final long newLowBits = lowBits - value;
  
          if (value >= 0)
          {
              if (IPv6AddressHelpers.isLessThanUnsigned(lowBits, newLowBits))
              {
                  // oops, we subtracted something postive and the result is bigger -> overflow detected (carry over one bit from high to low)
                  return new IPv6Address(highBits - 1, newLowBits);
              }
              else
              {
                  // no overflow
                  return new IPv6Address(highBits, newLowBits);
              }
          }
          else
          {
              if (IPv6AddressHelpers.isLessThanUnsigned(newLowBits, lowBits))
              {
                  // oops, we subtracted something negative and the result is smaller -> overflow detected (carry over one bit from low to high)
                  return new IPv6Address(highBits + 1, newLowBits);
              }
              else
              {
                  // no overflow
                  return new IPv6Address(highBits, newLowBits);
              }
          }
      }
docs: Subtraction. Will never underflow, but wraps around when the lowest ip address has been reached.
  
  @param value value to substract
  @return new IPv6 address