Skip to content

Commit 17fa327

Browse files
kzrnmtannergooding
andauthored
Fix TryParseBigIntegerHexOrBinaryNumberStyle (#97995)
* Fix TryParseBigIntegerHexOrBinaryNumberStyle * Fix typo * Add hex test --------- Co-authored-by: Tanner Gooding <[email protected]>
1 parent 5e0c638 commit 17fa327

File tree

2 files changed

+16
-3
lines changed

2 files changed

+16
-3
lines changed

src/libraries/System.Runtime.Numerics/src/System/Number.BigInteger.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ internal static ParsingStatus TryParseBigIntegerHexOrBinaryNumberStyle<TParser,
445445
int leadingBitsCount = value.Length % TParser.DigitsPerBlock;
446446

447447
uint leading = signBits;
448-
// First parse unanligned leading block if exists.
448+
// First parse unaligned leading block if exists.
449449
if (leadingBitsCount != 0)
450450
{
451451
if (!TParser.TryParseUnalignedBlock(value[0..leadingBitsCount], out leading))
@@ -484,8 +484,8 @@ internal static ParsingStatus TryParseBigIntegerHexOrBinaryNumberStyle<TParser,
484484
// Require to store in _bits.
485485

486486
// Positive: sign=1, bits=[leading]
487-
// Negative: sign=-1, bits=[leading ^ -1 + 1]=[-leading]
488-
result = new BigInteger((int)signBits | 1, [leading ^ signBits - signBits]);
487+
// Negative: sign=-1, bits=[(leading ^ -1) + 1]=[-leading]
488+
result = new BigInteger((int)signBits | 1, [(leading ^ signBits) - signBits]);
489489
return ParsingStatus.OK;
490490
}
491491
else

src/libraries/System.Runtime.Numerics/tests/BigInteger/parse.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,18 @@ public void Parse_Hex32Bits()
143143
Assert.True(BigInteger.TryParse("080000001", NumberStyles.HexNumber, null, out result));
144144
Assert.Equal(0x80000001u, result);
145145

146+
Assert.True(BigInteger.TryParse("F0000001", NumberStyles.HexNumber, null, out result));
147+
Assert.Equal(-0xFFFFFFFL, result);
148+
149+
Assert.True(BigInteger.TryParse("0F0000001", NumberStyles.HexNumber, null, out result));
150+
Assert.Equal(0xF0000001u, result);
151+
152+
Assert.True(BigInteger.TryParse("F00000001", NumberStyles.HexNumber, null, out result));
153+
Assert.Equal(-0xFFFFFFFFL, result);
154+
155+
Assert.True(BigInteger.TryParse("0F00000001", NumberStyles.HexNumber, null, out result));
156+
Assert.Equal(0xF00000001u, result);
157+
146158
// Regression test for: https://github.com/dotnet/runtime/issues/74758
147159
Assert.True(BigInteger.TryParse("FFFFFFFFE", NumberStyles.HexNumber, null, out result));
148160
Assert.Equal(new BigInteger(-2), result);
@@ -175,6 +187,7 @@ public void Parse_Hex32Bits()
175187
[InlineData("10000000000000000000000000000000", (long)int.MinValue)]
176188
[InlineData("010000000000000000000000000000001", 0x080000001L)]
177189
[InlineData("111111111111111111111111111111110", -2L)]
190+
[InlineData("100000000000000000000000000000001", -0xFFFFFFFFL)]
178191
[InlineData("0111111111111111111111111111111111", 0x1FFFFFFFFL)]
179192
public void Parse_BinSpecialCases(string input, long expectedValue)
180193
{

0 commit comments

Comments
 (0)