Depende exactamente de lo que quieres decir.
Si por conteo, quiere decir que la computadora tiene que ser capaz de representar cada número que le precede, como es el caso en el código de ejemplo que proporcionó, entonces descartamos números racionales e irracionales (o números de coma flotante como los llamaría) en informática). En ese caso, lo que usaríamos es algo así como la Estructura BigInteger. Sin embargo, a pesar de que esa documentación dice que “representa un entero con signo arbitrariamente grande”, puede arrojar una excepción OutOfMemoryException, porque eventualmente, no hay suficiente memoria para contener toda la información que necesitamos para representar un número. Stack Overflow tiene un tema sobre esto: ¿Hay un límite superior para BigInteger?
Para resumir y simplificar lo que hay en esa publicación, un entero normal está representado por 64 bits por una computadora (al menos en un sistema de 64 bits, también hay sistemas de 32 bits que solo usan 32 bits). Cada bit representa una potencia diferente de 2, que aumenta a medida que avanzamos hacia la izquierda, comenzando con [matemática] 2 ^ 0 = 1 [/ matemática]. Si piensa en números decimales, hacen lo mismo, excepto que usan potencias de 10 y cada potencia puede tener un factor de hasta 9. Como ejemplo, si solo tuviéramos dos bits para trabajar, entonces nuestro número más grande sería 0b11 (el 0b al frente significa que es un número binario, no un número base 10), o [matemáticas] 1 * 2 ^ 1 + 1 * 2 ^ 0 = 3 [/ matemáticas]. Otra forma de encontrar que 3 es el máximo es darse cuenta de que [matemáticas] \ text {0b100} – \ text {0b001} = (1 * 2 ^ 2 + 0 * 2 ^ 1 + 0 * 2 ^ 0) – (0 * 2 ^ 2 + 0 * 2 ^ 1 + 1 * 2 ^ 0) = 2 ^ 2 – 1 = 3 = \ text {0b11} [/ math] (recuerde que estos son números binarios, restando 1 del 0 más a la derecha) arrastrado “el 1). Entonces, si volvemos al caso de 64 bits como en las computadoras modernas, esto significa que el número entero más grande que podemos representar en un número entero normal es [matemática] 2 ^ {64} – 1 [/ matemática], o 18,446,744,073,709,551,616. Eso es bastante grande, pero usando la idea detrás de BigInteger, podemos llegar aún más alto.
La forma en que funciona BigInteger es que aumenta la cantidad de bytes que usamos para representar el entero mediante la concatenación de múltiples bits de múltiples enteros normales. Esto es diferente de decir que 2 y 2 son 22. En cambio, está concatenando la representación de bits. Entonces, si nuestros enteros normales tuvieran 2 bits de longitud, entonces 2 y 2 serían 0b10 y 0b10 => 0b1010 en binario, que es 10 en decimal. Esto aumenta nuestro número máximo de [matemáticas] 2 ^ 2 – 1 [/ matemáticas] con solo 2 bits a [matemáticas] 2 ^ 4 – 1 [/ matemáticas] con 4 bits. Dado que nuestro entero normal más grande es [math] 2 ^ {64} – 1 [/ math], solo podemos hacer un seguimiento de [math] 2 ^ {64} – 1 [/ math] enteros normales (dando a cada uno un número único como un identificador). Eso significa que podemos tener [math] 2 ^ {64} – 1 [/ math] conjuntos de 64 bits o [math] 64 * (2 ^ {64} – 1) [/ math] bits. El número máximo que todos esos bits podrían representar sería [matemática] 2 ^ {64 * (2 ^ {64} – 1)} – 1 [/ matemática]. Como han dicho otras respuestas, en realidad contar hasta ese número llevaría una eternidad y sería bastante tonto.
Sin embargo, si está menos preocupado por contar hasta ese número y le importa más cuál es el número más grande que podemos representar, entonces no tenemos límite, ya que somos libres de definir cualquier representación para los números. Por ejemplo, si en lugar de que cada bit sea una potencia de 2, podríamos decir que es una potencia de 10. Ya no podríamos representar todos los enteros como nuestro primer número … 0001 sería 1, pero nuestro segundo número … 00010 sería 10. Pero ahora podríamos representar un número hasta [matemáticas] 10 ^ {64 * (2 ^ {64} – 1)} – 1 [/ matemáticas].
Un ejemplo más práctico son los números de coma flotante que mencioné antes. También suelen usar 64 bits para representar un número decimal. Representan números haciendo que algunos bits sean una base y algunos bits sean un exponente de esa base, pero esto significa que no pueden representar exactamente todos los números dentro de su rango. Esto, en cambio, permite que su rango aumente a [matemáticas] 10 ^ {38} [/ matemáticas], mucho más grande que el número entero máximo de [matemáticas] 2 ^ {64} [/ matemáticas].
Y, por último, como un caso de uso práctico para números realmente grandes, el número primo más grande que hemos descubierto se hizo usando computadoras. Este número es [matemática] 2 ^ {74207281} – 1 [/ matemática]. Eso sí que es grande.