Come si formatta un unsigned long long int usando printf?

#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;
}

Uscita:

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

Suppongo che questo risultato inaspettato sia dovuto alla stampa del unsigned long long int. Come si fa a printf()un unsigned long long int?

Soluzione

Usate il modificatore ll (el-el) long-long con la conversione u (unsigned). (Funziona in Windows, GNU).

printf("%llu", 285212672);
Commentari (13)

Le cose non standard sono sempre strane :)

per la parte lunga lunga sotto GNU è L, ll o q.

e sotto windows credo che sia solo ll.

Commentari (0)

Beh, un modo è compilare come x64 con VS2008

Questo funziona come ci si aspetterebbe:

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);

Per il codice a 32 bit, dobbiamo usare il corretto specificatore di formato __int64 %I64u. Quindi diventa.

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);

Questo codice funziona sia per il compilatore VS a 32 che a 64 bit.

Commentari (1)