Longitud máxima de BigInteger
.NET 9 aplica una longitud máxima de BigInteger, que es que no puede contener más de (2^31) - 1
(aproximadamente 2,14 mil millones) bits. Este número representa una asignación de casi 256 MB y contiene aproximadamente 646,5 millones de dígitos. Este nuevo límite garantiza que todas las API expuestas se comporten bien y sean coherentes, a la vez que permiten números que están mucho más allá de la mayoría de los escenarios de uso.
Comportamiento anterior
Anteriormente, podría asignar un valor con una longitud de hasta Array.MaxLength * 32
bits a una variable BigInteger.
Nota:
Las máquinas típicas alcanzarían OutOfMemoryException mucho antes de que se alcanzara este límite.
Comportamiento nuevo
A partir de .NET 9, BigInteger tiene una longitud máxima de (2^31) - 1
(aproximadamente 2,14 mil millones) bits. Si intenta asignar un valor mayor, se produce un OverflowException en tiempo de ejecución. Por ejemplo, el código siguiente genera una excepción:
BigInteger bigInt = new BigInteger(-1) << int.MaxValue;
Versión introducida
.NET 9 Versión preliminar 6
Tipo de cambio importante
Este es un cambio de funcionamiento.
Motivo del cambio
BigInteger admite la representación de valores enteros de longitud esencialmente arbitraria. Sin embargo, en la práctica, la longitud está restringida por límites del equipo subyacente, como la memoria disponible o el tiempo que tardaría en calcular una expresión determinada. Además, existen algunas API que producen un error en las entradas dadas que dan como resultado un valor demasiado grande. Por estas razones, ahora se aplica una longitud máxima.
Acción recomendada
Si el código se ve afectado, reduzca la longitud del valor que va a asignar a BigInteger o agregue una comprobación de longitud.