Domanda

Ho del codice c (++) che usa sprintf per convertire un uint_64 in una stringa. Questo deve essere portatile sia per Linux che per Solaris.

Su Linux usiamo% ju, ma non sembra esserci alcun equivalente su Solaris. Il più vicino che riesco a trovare è% lu, ma questo produce un output errato. Alcuni esempi di codice:

#include <stdio.h>
#include <sys/types.h>

#ifdef SunOS
typedef uint64_t u_int64_t;
#endif

int main(int argc, char **argv) {
    u_int64_t val = 123456789123L;

#ifdef SunOS
    printf("%lu\n", val);
#else
    printf("%ju\n", val);
#endif
}

Su Linux, l'output è come previsto; su Solaris 9 (non chiedere), è " 28 "

Cosa posso usare?

È stato utile?

Soluzione

Se hai inttypes.h disponibile puoi usare le macro che fornisce:

printf(  "%" PRIu64 "\n", val);

Non carino (sembra che lo dica molto di recente), ma funziona.

Altri suggerimenti

Su un sistema conforme a C99:

#include <inttypes.h>

uint64_t big = ...;
printf("%" PRIu64 "\n", big);

Vedi sezione 7.8 dello standard C99.

Gli specificatori sono {PRI, SCN} [diouxX] {N, LEASTN, MAX, FASTN, PTR}

Dove PRI è per la famiglia printf (), SCN è per la famiglia scanf (), d e i per i tipi integrali firmati; o, u, x, X sono per tipi integrali senza segno come ottale, decimale, esadecimale e esadecimale; N è una delle larghezze supportate; LEAST e FAST corrispondono a quei modificatori; PTR è per intptr_t; e MAX è per intmax_t.

La risposta dipende dal fatto che il tuo codice sia effettivamente C o C ++. In C, dovresti usare un unsigned long long piuttosto che un altro tipo (questo è conforme allo standard attuale e long long è abbastanza comune per quanto riguarda il supporto C99 ), aggiungendo ULL anziché L alla tua costante e utilizzando (come è stato menzionato) % llu come identificatore. Se il supporto per C99 non esiste, è possibile controllare la documentazione del compilatore, poiché non esiste un altro modo standard per farlo. long long è garantito almeno 64 bit.

Puoi usare % llu per molto tempo. Tuttavia, anche questo non è molto portatile, perché long long non è garantito per essere 64 bit. : -)

Puoi ottenere uint64_t da stdint.h se vuoi evitare il typedef condizionale di SunOS.

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