Aquí podría ser tu PUBLICIDAD


¿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 andrewrk
En otros idiomas...        العربية       

11 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 10:02
fuente por usuario John Downey


Aquí podría ser tu PUBLICIDAD


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 Nathan Fellman

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 03:26
fuente por usuario Steven

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 05:48
fuente por usuario Shivam Chauhan

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 Paul Hargreaves

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 Adam Pierce

votos
8

Compilarlo como x64 con VS2005:

% Llu funciona bien.

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

votos
4

Maleficio:

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

Salida:

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

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 10:03
fuente por usuario sparkes

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 Bernd Elkemann

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 10:40
fuente por usuario vzczc


Aquí podría ser tu PUBLICIDAD