2010-03-10 14 views
5

Estoy trabajando en proyectos relacionados con la programación c para mi curso de matemáticas en la universidad. Necesito poder manejar enteros grandes, más grandes que aquellos que se pueden almacenar en un tipo de datos 'long int'. Así que traté de usar 'de largo long int', pero si intento algo como esto:'long long int' se interpreta como 'long int'. ¿Cómo puedo evitar esto?

long long int number; 
number = 10000000000; 

A continuación, el mensaje de error dice 'error: constante entera demasiado grande para el tipo 'larga''.

He intentado con otros tipos de datos como '___int64' e 'int_64t' He intentado incluir todas las bibliotecas c estándar y sigo teniendo el mismo problema.

Curiosamente, cuando intento 'printf("LLONG_MAX = %lld\n", LLONG_MAX);', me sale esto:

LLONG_MAX = -1 

estoy usando bloques de código 8.02 en Windows XP, pero no estoy seguro de qué versión del compilador gcc se instala ya que estoy usando computadoras de la red en el campus y no tengo permiso para acceder al sistema de archivos principal. No quiero tener que llevar mi computadora portátil al campus todos los días. ¡Por favor ayuda! Gracias

Respuesta

1

En Microsoft entorno de uso printf con esta sintaxis:

 
    __int64 i64 = 10000000000; 
    unsigned __int64 u64 = 10000000000000000000; 

    printf ("%I64d\n", i64); 
    printf ("%I64u\n", u64); 
    printf ("%I64d\n", u64); <-- note this typo 

+0

Gracias! Está funcionando ahora :) – Eddy

3

Agregue ll al final de su constante entera.

+0

Lo he intentado. no funciona número = 10000000000ll printf ("número =% lld, número); me da 'número = 1410065408' – Eddy

+0

Quizás podría especificar que" ll "es minúscula" LL "en su lugar, no estaba seguro de la diferencia entre lo que escribió y once (11) [EDITAR] Si sabe dónde está instalado gcc, puede escribir "gcc -v" para obtener la versión. –

+0

Sí, disculpe la confusión. No estoy seguro cómo obtener la versión de gcc, estoy usando Windows XP, no Linux, por lo que el comando 'gcc' no se reconoce en el símbolo del sistema. – Eddy

0

Um, Code :: Blocks usa GCC como compilador habitual. Y las versiones recientes de eso admiten tipos de 64 bits explícitamente.

lo que debería ser capaz de

#include <inttypes.h> 
uint64_t unsigned64BitNumber; 
int64_t signed64BitNumber; 
0

Usted debe ser capaz de utilizar a largo long int con un compilador gcc pero creo que puede requerir el uso del código C99 std, donde como su defecto puede ser el modo de C89. intente agregar --std = c99 a su línea de comandos del compilador y vea si esto ayuda :-)

+0

Eso es además de la respuesta de pavpanchekha – PinkyNoBrain

+0

Lo siento, soy un poco nuevo, estoy no estoy usando una línea de comando, solo estoy haciendo clic en 'compilar y ejecutar' en Codeblocks. ¿Cómo hago esto? – Eddy

+0

No hay problema. Ha pasado un tiempo desde que usé bloques de código, pero creo que ir a "configuración" y luego "compilador y depurador" abre la ventana correspondiente. Desde allí, desea la "pestaña Configuradores del compilador/indicadores del compilador" y buscar y la opción de usar el modo C99 o ISO C90 para los programas c. No estoy seguro del nombre exacto de la opción. A mitad de camino http://www.codeblocks.org/docs/main_codeblocks_en3.html describe la ventana de opciones del compilador – PinkyNoBrain

0

Quizás el compilador se confunde con la porción int del tipo de datos - ¿ha intentado utilizar un long long en su lugar?

This website podría ayudarlo.

+0

Lo he intentado. Eché un vistazo a este sitio web también, lo que me llevó a probar 'printf ("LLONG_MAX =% lld" LLONG_MAX);'. Me da LLONG_MAX = -1 que es bastante extraño :( – Eddy

11

Cuando el compilador compila su archivo C y encuentra un entero o una constante de punto flotante, necesita asignarle un tipo. Implícitamente elegirá un tipo predeterminado para usted. Puede establecer explícitamente el tipo proporcionando al compilador el sufijo entero. Un sufijo de número entero puede decirle al compilador si es largo, largo o sin signo.

  • 10 es implícitamente un entero con signo
  • 10u, 10U es explícitamente un entero sin signo
  • 10L, 10L es explícitamente un entero largo firmado
  • 10ll, 10LL o 10i64 en Win32 es explícitamente una firmaron largo entero largo
  • 10ull es explícitamente un unsigned long long

tipos de puntos flotantes también tienen esta situación. Un tipo puede ser un flotador, un doble o un doble largo. Un tipo de punto flotante suele ser el doble.

  • 10,0 es implícitamente un doble
  • 10.0f o 10.0F es explícitamente un flotador
  • 10.0l o 10.0L es explícitamente un largo doble
0

Además de los comentarios anteriores acerca de sufijos y modo gcc C99, si no puede obtener mucho tiempo de trabajo, Y solo necesita números enteros de hasta 2^52, puede salirse con la suya usando el doble. Los enteros de hasta 2^52 deben ser exactamente representables como dobles suponiendo un formato de doble precisión IEEE (exponente de polarización 0 +1).

0

medida que la gente ya publicada, debe comprobar lo compilador que está utilizando. En Código: Bloques que haces (en mi versión de todos modos, es de esperar que va a funcionar para usted también):

En primer lugar averiguar qué se selecciona compilador para su proyecto seleccionando Proyecto-> Opciones de construcción ... y ver qué dice en el "Compilador seleccionado"

Luego seleccione: Configuración-> Compilador y depurador ... y seleccione el compilador que acaba de encontrar. Luego haga clic en "Ejecutables de la cadena de herramientas" y vea lo que dice, p. Ej. "C compilador".

Tal vez si tiene éxito y publica sus resultados, alguien aquí podrá ayudarlo.

Cuestiones relacionadas