Domanda

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

Output:

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

Presumo che questo risultato inatteso è la stampa la unsigned long long int.Come si fa printf() un unsigned long long int?

È stato utile?

Soluzione

Utilizzare la ll el-el) a lungo-lunga modificatore con la u (unsigned) di conversione.(Funziona anche in windows, GNU).

printf("%llu", 285212672);

Altri suggerimenti

Si potrebbe desiderare di provare a utilizzare il inttypes.h libreria che fornisce i tipi di int32_t, int64_t, uint64_t ecc.È quindi possibile utilizzare le macro come:

uint64_t x;
uint32_t y;

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

Questo è "garantito" per non dare lo stesso problema come long, unsigned long long ecc, in quanto non si hanno a indovinare quanti bit sono in ogni tipo di dati.

%d--> per int

%u--> per unsigned int

%ld--> per long int

%lu--> per unsigned long int

%lld--> per long long int

%llu--> per unsigned long long int

Per lungo tempo (o __int64) utilizzando MSVS, si dovrebbe usare %I64d:

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i

Che è perché %llu non funziona correttamente in Windows e %d e non in grado di gestire gli interi a 64 bit.Io suggerisco di usare PRIu64, invece, e troverete che è portable per Linux.

Invece, provare questo:

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

Uscita

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

In Linux è %llu e in Windows è %I64u

Anche se ho trovato non funziona in Windows 2000, non sembra essere un bug c'è!!!

Compilarlo come x64 con VS2005:

%llu funziona bene.

Non-standard, le cose sono sempre strano :)

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

e sotto windows credo sia ll solo

Hex:

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

Output:

64bit: FFFFFFFFFFFFFFFF

In aggiunta a ciò che la gente scriveva anni fa:

  • si potrebbe ottenere questo errore su gcc/mingw:

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

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

Quindi la versione di mingw non di default per c99.Aggiungere questo flag del compilatore: -std=c99.

Beh, è un modo per compilarlo 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, abbiamo bisogno di usare il corretto __int64 identificatore di formato %I64u.Così si 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 per entrambe le versioni a 32 e 64 bit VS compilatore.

A quanto pare nessuno è venuto con un multi-piattaforma* soluzione per più di un decennio poiché [i] l'anno 2008, così potrò aggiungere miniera 😛.Plz upvote.(Scherzando.Non mi interessa.)

Soluzione: lltoa()

Come utilizzare:

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

OP esempio:

#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 differenza del %lld stampa la stringa di formato, questo funziona per me al di sotto di 32-bit GCC su Windows.

*) Beh, quasi multi-piattaforma.In MSVC, a quanto pare è necessario _ui64toa() invece di lltoa().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top