말 그대로 엄청나게 큰 수 입니다.
저는 .NET에서 엄청나게 큰 수를 다룰 때는 보통 double, long 타입을 주로 쓰곤 했습니다.
필요하다면 ulong 같은 unsigned 타입을 쓰곤 했습니다.
이거보다 큰 수는 다뤄본 적이 없는데 만약 더 큰 수가 필요하다면 어떻게 처리를 해야할까 궁금했습니다.
혹시나 코딩 테스트같은걸로 나오면 어떻게 하지? 라는 생각도 있었는데요.
혹시나 싶어 찾아보니 .NET에서는 매우 큰 수를 다룰 때 이런 구조체가 있었습니다.
도대체 어떻게 동작하는지 당연히 내부를 뜯어 봐야겠죠?
제가 궁금했던 부분은 어떻게 할당되는지 였습니다.
내부적으로 uint[] 배열이 선언되어 거기에 할당이 됩니다.
https://referencesource.microsoft.com/#System.Numerics/System/Numerics/BigInteger.cs,41
internal uint[] _bits;
이것이 각각의 BigInteger 생성자마다 동적으로 배열의 길이를 할당하여 동작하고 있었습니다.
주로 시프트 연산을 통해 연쇄적으로 할당하는 모습이 보이네요.
https://referencesource.microsoft.com/#System.Numerics/System/Numerics/BigInteger.cs,390
Double이나 Float(Single) 의 소수부가 존재하는 수들은 아래 SetBitsFromDouble메서드의 도움을 받고 있네요.
문자열로된 큰~ 수는 Parse 메서드를 통해 할당하고 있습니다.
BigNumber
https://referencesource.microsoft.com/#System.Numerics/System/Numerics/BigInteger.cs,806
각 수 별로 비교를 하는 메서드들은 아래에 있습니다.
https://referencesource.microsoft.com/#System.Numerics/System/Numerics/BigInteger.cs,1129
요약 : BigInteger는 내부적으로 uint 배열로 처리되고 있다.