   public init<T : FixedWidthInteger>(
     _ value: T, radix: Int = 10, uppercase: Bool = false
   ) where T : UnsignedInteger {
-    _precondition(radix > 1, "Radix must be greater than 1")
-    self = _uint64ToString(
-      UInt64(value), radix: Int64(radix), uppercase: uppercase)
+    _precondition(2...36 ~= radix, "Radix must be between 2 and 36")
+    if T.bitWidth <= 64 {
+      self = _uint64ToString(
+        UInt64(value), radix: Int64(radix), uppercase: uppercase)
+    } else {
+      self = _integerToString(value, radix: radix, uppercase: uppercase)
+    }
   }
   
   /// Creates a string representing the given value in base 10, or some other

  public init<T : UnsignedInteger>(
    _ value: T, radix: Int = 10, uppercase: Bool = false
  ) {
    _precondition(radix > 1, "Radix must be greater than 1")
    self = _uint64ToString(
      UInt64(value), radix: Int64(radix), uppercase: uppercase)
  }

  public init<T : FixedWidthInteger>(
    _ value: T, radix: Int = 10, uppercase: Bool = false
  ) where T : SignedInteger {
    _precondition(2...36 ~= radix, "Radix must be between 2 and 36")
    if T.bitWidth <= 64 {
      self = _int64ToString(
        Int64(value), radix: Int64(radix), uppercase: uppercase)
    } else {
      self = _integerToString(value, radix: radix, uppercase: uppercase)
    }
  }
  
  /// Creates a string representing the given value in base 10, or some other
