Entero de 64 bits y GCC

Hola a todos.

Estoy intentado hacer un programa en C++ y necesito utilizar un entero de 64 bits, he probado con:

"off64_t tam_maximo = 4649385984;"
"__int64_t tam_maximo = 4649385984;"
"long long int tam_maximo = 4649385984;"

Y siempre obtengo el error:

main.cc:264: error: la constante entera es demasiado grande para el tipo "long"

He buscado por Google y solamente he visto que ponga "long long", pero no me funciona :(

Estoy usando Ubuntu, y mi versión de GCC es:
gcc.real (GCC) 3.3.5 (Debian 1:3.3.5-6ubuntu1)


Gracias.

------------------

Pues acabo de encontrar la solución, es poniendo "LL" detrás del número y así lo trata como una constante de 64 bits. [+risas]

Pero ya que he abierto el hilo, aprovecho. ¿Como podría hacerlo para que fuera portable? ¿que tendría que poner en el fichero configure.in?
creo que lo de Long long lo admite el C de por si
(al menos para gcc)

Es más si lo compilas en una maquina de 32 bits tambien ira

Lo que no he probado es si en una maquina de 64 bits por defecto los
int ya son de 64 bits (por defecto en las de 32 los int son de 32 y no
hace falta especificar el long)
has probado como double?
"double tam_maximo = 4649385984;"
Double son numeros en coma flotante de 64 bits
creo que el quiere enteros de 64 bits
Sí, yo quería usar enteros, al final funciona con:
long long int tam_maximo = 4649385984LL;

Se ve que el problema era la constante y no la variable :p

Por cierto, ya aprovecho, en Linux, ¿existe alguna función para copiar o mover ficheros?, en Windows existen las API de CopyFile y MoveFile, pero para Linux no encuentro nada. Sí, se que una copia normal de ficheros no es díficil de implementar, pero por ejemplo para mover ficheros y que sea eficiente ya es otra cosa. :?

Harl escribió:Lo que no he probado es si en una maquina de 64 bits por defecto los
int ya son de 64 bits (por defecto en las de 32 los int son de 32 y no
hace falta especificar el long)


En 64 bits que yo sepa, los int son 32 bits, los long y los punteros 64 bits, y los "long long" mmm.... pues ni idea :p
Adso58 escribió:
Por cierto, ya aprovecho, en Linux, ¿existe alguna función para copiar o mover ficheros?, en Windows existen las API de CopyFile y MoveFile, pero para Linux no encuentro nada. Sí, se que una copia normal de ficheros no es díficil de implementar, pero por ejemplo para mover ficheros y que sea eficiente ya es otra cosa. :?


En POSIX a pelo no, que yo sepa.


En 64 bits que yo sepa, los int son 32 bits, los long y los punteros 64 bits, y los "long long" mmm.... pues ni idea :p


Depende de la arquitectura, yo no lo afirmaría.
Churly escribió:
En POSIX a pelo no, que yo sepa.


¿Y alguna forma aunque no sea POSIX? ¿Algo con las libc, o con alguna llamada propia de Linux?

Ahora mismo estaba haciendo un programita para una chorrada y tampoco me preocupa, he creado una función para copiar y ya esta. Pero quizás más adelante haré uno que necesite mover y como tenga que hacerlo a manoa... :p

Vamos, supongo que algo habrá, no habrá que estar teniendo en cuenta el sistema de ficheros y todo eso, espero.



Churly escribió:Depende de la arquitectura, yo no lo afirmaría.


Tienes razón, de lo que yo hablaba era AMD64, es lo que leí mientras buscaba información sobre el "long long int".
Hombre, utilizando POSIX te funcionará en casi todos los SO que existen actualmente, incluso Windows tiene una capa POSIX (no funciona del todo bien, pero para estas cosas va bien).

Mover es mucho más sencillo que copiar, es sencillamente renombrar el archivo con una llamada al sistema.
Churly escribió:Hombre, utilizando POSIX te funcionará en casi todos los SO que existen actualmente, incluso Windows tiene una capa POSIX (no funciona del todo bien, pero para estas cosas va bien).

Mover es mucho más sencillo que copiar, es sencillamente renombrar el archivo con una llamada al sistema.


Sí, eso sí. Y lo de renombrar, pues la verdad es que tienes razón, lo que pasa que dudo que funcione el renombrar por ejemplo entre 2 directorios o unidades distintas. Por eso decía lo de que aunque no fuese POSIX sería preferible.

Tendré que probar eso de renombrar entre 2 directorios, a ver si cuela. [Ooooo]
8 respuestas