private static ushort Parse(ReadOnlySpan <char> s, NumberStyles style, NumberFormatInfo info) { Number.ParsingStatus status = Number.TryParseUInt32(s, style, info, out uint i); if (status != Number.ParsingStatus.OK) { Number.ThrowOverflowOrFormatException(status, TypeCode.UInt16); } if (i > MaxValue) { Number.ThrowOverflowException(TypeCode.UInt16); } return((ushort)i); }
private static sbyte Parse(ReadOnlySpan <char> s, NumberStyles style, NumberFormatInfo info) { Number.ParsingStatus status = Number.TryParseInt32(s, style, info, out int i); if (status != Number.ParsingStatus.OK) { Number.ThrowOverflowOrFormatException(status, TypeCode.SByte); } // For hex number styles AllowHexSpecifier >> 2 == 0x80 and cancels out MinValue so the check is effectively: (uint)i > byte.MaxValue // For integer styles it's zero and the effective check is (uint)(i - MinValue) > byte.MaxValue if ((uint)(i - MinValue - ((int)(style & NumberStyles.AllowHexSpecifier) >> 2)) > byte.MaxValue) { Number.ThrowOverflowException(TypeCode.SByte); } return((sbyte)i); }