def get_suitable_int_type(upper: int, lower: int=0) ->str:
    """Returns the suitable integer type with the least bits.

  Returns the integer type that can hold all values between max_val and min_val
  (inclusive) and has the least bits.

  Args:
    max_val: Maximum value that needs to be valid.
    min_val: Minimum value that needs to be valid.

  Returns:
    The suitable type.
  """
    assert upper >= lower
    upper = max(upper, 0)
    lower = min(lower, 0)
    if lower == 0:
        return 'uint%d' % upper.bit_length()
    return 'int%d' % (max(upper.bit_length(), (lower + 1).bit_length()) + 1)
