¿Cómo se imprime f un int largo largo no firmado (el especificador de formato para unsigned long long int)?

votos
286
#include <stdio.h>
int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    printf(My number is %d bytes wide and its value is %ul. A normal number is %d.\n, sizeof(num), num, normalInt);
    return 0;
}

Salida:

My number is 8 bytes wide and its value is 285212672l. A normal number is 0.

Supongo que este resultado inesperado es de imprimir el unsigned long long int. ¿Cómo hacer que printf()una unsigned long long int?

Publicado el 05/08/2008 a las 21:59
fuente por usuario
En otros idiomas...                            


12 respuestas

votos
380

Use el modificador ll (el-el) long-long con la conversión u (sin signo). (Funciona en Windows, GNU).

printf("%llu", 285212672);
Respondida el 05/08/2008 a las 22:02
fuente por usuario

votos
4

Las cosas no estándar siempre son extrañas :)

para la porción larga larga bajo GNU es L, lloq

y bajo Windows creo que es llsolo

Respondida el 05/08/2008 a las 22:03
fuente por usuario

votos
1

Bueno, una forma es compilarlo como x64 con VS2008

Esto funciona como era de esperar:

int normalInt = 5; 
unsigned long long int num=285212672;
printf(
    "My number is %d bytes wide and its value is %ul. 
    A normal number is %d \n", 
    sizeof(num), 
    num, 
    normalInt);

Para el código de 32 bits, necesitamos usar el especificador de formato __int64 correcto% I64u. Entonces se vuelve.

int normalInt = 5; 
unsigned __int64 num=285212672;
printf(
    "My number is %d bytes wide and its value is %I64u. 
    A normal number is %d", 
    sizeof(num),
    num, normalInt);

Este código funciona para el compilador VS de 32 y 64 bits.

Respondida el 05/08/2008 a las 22:40
fuente por usuario

votos
71

Es posible que desee probar el uso de la biblioteca inttypes.h que proporciona tipos, tales como int32_t, int64_t, uint64_tetc. A continuación, puede utilizar sus macros, tales como:

uint64_t x;
uint32_t y;

printf("x: %"PRId64", y: %"PRId32"\n", x, y);

Esto está "garantizado" para no darle el mismo problema que long, unsigned long longetc., ya que no tiene que adivinar cuántos bits hay en cada tipo de datos.

Respondida el 12/08/2008 a las 12:07
fuente por usuario

votos
29

Eso es porque% llu no funciona correctamente en Windows y% d no puede manejar enteros de 64 bits. Sugiero usar PRIu64 en su lugar y también encontrarás que es portátil para Linux.

Pruebe esto en su lugar:

#include <stdio.h>
#include <inttypes.h>

int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    /* NOTE: PRIu64 is a preprocessor macro and thus should go outside the quoted string. */
    printf("My number is %d bytes wide and its value is %"PRIu64". A normal number is %d.\n", sizeof(num), num, normalInt);
    return 0;
}

Salida

My number is 8 bytes wide and its value is 285212672. A normal number is 5.
Respondida el 09/09/2008 a las 08:54
fuente por usuario

votos
9

En Linux es %lluy en Windows es%I64u

Aunque descubrí que no funciona en Windows 2000, ¡parece que hay un error allí!

Respondida el 11/09/2008 a las 01:57
fuente por usuario

votos
34

Durante mucho tiempo (o __int64) usando MSVS, debe usar% I64d:

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i
Respondida el 06/09/2009 a las 15:26
fuente por usuario

votos
8

Compilarlo como x64 con VS2005:

% Llu funciona bien.

Respondida el 11/10/2012 a las 07:23
fuente por usuario

votos
30

%d-> para int

%u-> para unsigned int

%ld-> para long int

%lu-> para unsigned long int

%lld-> para long long int

%llu-> para unsigned long long int

Respondida el 13/05/2015 a las 17:48
fuente por usuario

votos
4

Maleficio:

printf("64bit: %llp", 0xffffffffffffffff);

Salida:

64bit: FFFFFFFFFFFFFFFF
Respondida el 26/07/2015 a las 09:57
fuente por usuario

votos
2

Además de lo que la gente escribió hace años:

  • es posible obtener este error en gcc / MinGW:

main.c:30:3: warning: unknown conversion type character 'l' in format [-Wformat=]

printf("%llu\n", k);

Entonces su versión de MinGW no por defecto a C99. Añadir esta bandera del compilador: -std=c99.

Respondida el 17/01/2016 a las 09:27
fuente por usuario

votos
0

Al parecer, nadie ha llegado con una multiplataforma * solución para más de una década desde que [la] año 2008, por lo que deberá ir acompañada de la mina 😛. PLZ upvote. (Bromeando. No me importa.)

Solución: lltoa()

Cómo utilizar:

#include <stdlib.h> /* lltoa() */
// ...
char dummy[255];
printf("Over 4 bytes: %s\n", lltoa(5555555555, dummy, 10));
printf("Another one: %s\n", lltoa(15555555555, dummy, 10));

El ejemplo de OP:

#include <stdio.h>
#include <stdlib.h> /* lltoa() */

int main() {
    unsigned long long int num = 285212672; // fits in 29 bits
    char dummy[255];
    int normalInt = 5;
    printf("My number is %d bytes wide and its value is %s. "
        "A normal number is %d.\n", 
        sizeof(num), lltoa(num, dummy, 10), normalInt);
    return 0;
}

A diferencia de la %lldcadena de formato de impresión, éste funciona para mí bajo GCC de 32 bits en Windows.

*) Bueno, casi multiplataforma. En MSVC, que al parecer necesita _ui64toa()en lugar de lltoa().

Respondida el 22/03/2019 a las 22:08
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more