Rango de int

11/10/2005 - 07:42 por Pedro Rivera | Informe spam
A ver si ahora si me explico:

Supongamos que tengo una cadena.
La propiedad "Count" de una cadena me devuelve un numero ENTERO que indica
la cantidad de caracteres que hay en la cadena ¿cierto?.
El rango de valores permisibles para el tipo "int" (segun un libro que
tengo) va desde -2,147,483,647 bytes hasta 2,147,483,647 bytes ¿cierto?,
despues de esa cantidad, el tipo que se ocupa es "double" o "float" ¿cierto?.
Segun lo que he visto al manejar archivos de texto, cada caracter ocupa un
byte ¿cierto?.

Lo anterior me lleva a pensar que la cantidad maxima de caracteres que puede
almacenar una cadena es 2,147,483,647, o el doble o el cuadruple, eso no es
relevante ahora.

Si le agrego 10 o 15 o 3000 caracteres a la cadena, ¿que cantidad y de que
tipo me devuelve la propiedad "Count" de la cadena? ¿Tendre problemas al
tratar de guardar la cadena en un archivo?

Pregunto esto porque ya trate de hacerlo (guardar caracteres de mas en la
cadena y guardar la cadena en un archivo) y no experimente problema alguno,
pero no quisiera que mi aplicacion fallara en un futuro. ¿Estoy haciendo una
interpretacion erronea de la capacidad de los tipos?

Si han jugado tetris, recordaran que en la puntuacion, despues de terminar
la segunda vuelta, surge un error, porque el tipo de datos tal vez sea
"short" y no soporta mas de 32767, y a partir de este numero la cadena de
puntuacion aparece con simbolos extraños.
 

Leer las respuestas

#1 A.Poblacion
11/10/2005 - 08:02 | Informe spam
"Pedro Rivera" wrote in message
news:
Supongamos que tengo una cadena.
La propiedad "Count" de una cadena me devuelve un numero ENTERO que indica
la cantidad de caracteres que hay en la cadena ¿cierto?.



Bueno, en realidad la propiedad se llama "Length", pero da igual.

El rango de valores permisibles para el tipo "int" (segun un libro que
tengo) va desde -2,147,483,647 bytes hasta 2,147,483,647 bytes ¿cierto?,
despues de esa cantidad, el tipo que se ocupa es "double" o "float"


¿cierto?.

No. También tienes el uint (de 0 a 4000 millones) y el "long" o "Int64",
que llega hasta 2 elevado a 63 (unos 9 trillones más o menos). Y el
"decimal", que tiene 128 bits, y soporta decimales con precisión exacta.
Todos ellos son mejores que el double o float cuando hay que tratar enteros,
ya que estos dos últimos introducen errores de precisión en cuanto se supera
la capacidad de su mantisa.

Segun lo que he visto al manejar archivos de texto, cada caracter ocupa un
byte ¿cierto?.



No. .Net los trata como Unicode, con lo cual se ocupan 2 bytes por
carácter.

Lo anterior me lleva a pensar que la cantidad maxima de caracteres que


puede
almacenar una cadena es 2,147,483,647, o el doble o el cuadruple, eso no


es
relevante ahora.

Si le agrego 10 o 15 o 3000 caracteres a la cadena, ¿que cantidad y de que
tipo me devuelve la propiedad "Count" de la cadena? ¿Tendre problemas al
tratar de guardar la cadena en un archivo?



Tendrás muchos problemas al añadir los caracteres. La propiedad Length
está definida como Int32, con lo que se desbordará al pasar de ese tamaño
máximo, y una de dos, o pasará a tener un valor negativo, si los autores de
la clase String la programaron en modo unchecked{}, o lanzará una excepción
si programaron en modo checked{}. Lo peor no es la propiedad en sí misma,
sino que los métodos internos para almacenar los caracteres en memoria
probablemente deben estar trabajando con ints. De hecho, dudo mucho que el
propio gestor de memoria de .Net sea capaz de asignar un bloque de memoria
de más de dos gigabytes.
Grabar más de dos gigas en un fichero sí que se puede, con la condición
de que el sistema de archivos sea NTFS (FAT no lo admite por las mismas
razones, ya que internamente codifica el tamaño del archivo en un int). Pero
la instrucción de grabación, Stream.Write, también usa un integer, por lo
que para escribir más de 2 GB tendrías que hacerlo "a cachos", en varias
operaciones de escritura separadas.

Preguntas similares