2012-01-10 28 views
5

En C en un sistema de 32 bits, ¿qué tipo de datos almacenará (y por lo tanto puede imprimir) el número entero más grande? ¿Es long long o unsigned long? ¿Hay un unsigned long long? ¿Y cuál es el más preciso y políticamente correcto?¿Cuál es el tipo de datos más grande para almacenar (e imprimir) un número entero?

+4

Si no eres más que preocupados por la posibilidad de mostrar grandes números, yo votaría por char *. :) –

+2

Puede estar haciendo la pregunta incorrecta. * ¿Qué tan alto necesita ir? * – Jon

+1

Sí, C99 admite un tipo primitivo 'sin signo largo ', pero C90 no. Y dado que muchos de los compiladores de C que existen en libertad todavía son C90, la respuesta podría ser no. ¿En cuál estás usando/interesado? –

Respuesta

10

Su pregunta es poco clara, pero intmax_t es el tipo de valor entero con signo más grande (y uintmax_t es el tipo de entero sin signo más grande). Estos son typedefs definidos en <stdint.h>, pero si los está imprimiendo, necesita <inttypes.h> en su lugar, y las macros PRInMAX para varios valores de n.

+5

Y 'uintmax_t' (si la implementación los admite, se agregaron en C99). –

+0

¿No funciona '% jd' y'% ju' (y se ve mejor) para imprimir 'intmax_t' y' uintmax_t' respectivamente? Fuente: - [el último borrador c11 libremente disponible] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf), consulte la sección 7.21.6.1 sobre 'fprintf' –

1

En ISO C99 long long tiene al menos 64 bits, que es el tipo de datos entero estándar más grande. También viene como unsigned long long. Aparentemente su compilador podría proporcionar tipos más grandes que se definen por intmax_t y uintmax_t.

Sin embargo, en base a sus comentarios es posible que esté buscando una biblioteca bigint como GMP. Permite enteros largos arbitrarios (y punto flotante) de longitud limitada solo por los recursos de su sistema.

+4

Sí (tenga en cuenta que 'long long' y' unsigned long long' son tipos distintos), pero las implementaciones pueden tener * tipos enteros extendidos * que son más anchos que 'long long'. Los typedefs 'intmax_t' y' uintmax_t', definidos en '' y '', corresponden a los tipos más grandes firmados y no firmados, respectivamente, independientemente de si son tipos extendidos o no. –

+0

@KeithThompson Gracias lo incorporé. – ChrisWue

0

El tipo de datos con la cadena impresa más larga es un tipo de datos con signo, a menos que tenga un tipo entero que tenga un valor máximo sin signo que sea un dígito más largo que el valor máximo firmado.

Por ejemplo, un entero de 4 bits sin signo sería a lo sumo dos caracteres sin signo o un carácter más el signo negativo cuando se firme.

Por lo tanto, debe elegir un tipo de datos firmado para representar la cadena impresa más grande. Que debería ser long long.

+0

el Las cadenas impresas más largas para 'int64_t' y' uint64_t' son '-9223372036854775808' y' 18446744073709551615', respectivamente, que tienen la misma longitud –

2

Sin andarse por las ramas Me gustaría decir que a veces no en la práctica de codificación actual bt sí definitivamente en algunas competiciones uno podría necesitar tipos de datos muy grandes bt Creo que podemos hacer esto. Por qué no tomar la secuencia completa en forma de cadena y luego utilizar la función atoi para obtener el valor entero es correcta Creo politcally :: :)

#include<stdio.h> 
#include<stdlib.h> 

int main() 
{ 
    int i; 
    char bigString [256]; 

    printf ("Enter a number: "); 
    fgets (bigString, 256, stdin); 

    i = atoi (bigString); 
    printf ("The value entered is %d.",i); 

    return 0; 
} 
+5

. Aún necesita almacenar el valor convertido en un entero que todavía causa el desbordamiento. – Sinstein

Cuestiones relacionadas