2013-10-20 14 views
5
#include <stdio.h> 
#include <string.h> 

int main(void) { 
    char buf[256] = {}; 
    unsigned long i=13835058055298940928; 
    snprintf(buf, 1024, "%lx", i); /* Line 7 */ 
    printf("%s\n",buf); 
    return 0; 
} 

In Zeile 7, wenn ich %lux verwende dann nicht snprintf jegliche Konvertierung nicht tun, und drucke nur 0x13835058055298940928x, während, wenn ich nur %lx verwenden, druckt es eine Hex-Konvertierung erwartet.unsigned long hexadezimale Darstellung

Wie stelle ich unsigned long in hex?

+3

Hexadezimal ist egal ob signed oder unsigned - x ist alles was du brauchst. –

+1

'% lux' scheint wie'% lu' + 'x' behandelt zu werden –

+0

Und Sie übergeben' 1024' anstelle von '256' als Pufferspeicher –

Antwort

16

Ein Format von "%lux" wird als "%lu" (unsigned long, dezimal) behandelt, gefolgt von einem Buchstaben x.

Das Format "%x" erfordert ein Argument vom unsigned-Typ; Es gibt keinen (direkten) Mechanismus, um vorzeichenbehaftete Ganzzahlen im hexadezimalen Format zu drucken.

Das Format zum Drucken eines unsigned long-Werts in Hexadezimal ist "%lx". (x ist hexadezimal, d decimal signiert ist, u unsigned decimal ist, jede von ihnen kann mit l für lange qualifiziert werden.)

Hinweis, dass der Wert 13835058055298940928 mindestens einen 64-bit unsigned Typen erfordert es zu speichern, ohne Überlauf . Der Typ unsigned long ist mindestens 32 Bit; es ist 64 Bits auf einige Systeme, aber keineswegs alle. Wenn Sie möchten, dass Ihr Code portabel ist, sollten Sie den Typ unsigned long long statt unsigned long verwenden. Das Format zum Drucken eines unsigned long long-Werts in Hexadezimalformat lautet "%llx".

Aus Gründen der Klarheit ich vorangehen in der Regel hexadezimale Ausgabe mit 0x, so ist es dem Leser klar, dass es sich um eine Hexadezimalzahl ist:

printf("0x%llx\n", some_unsigned_long_long_value); 

(Sie können das gleiche Ergebnis mit %#llx erreichen, aber ich finde es einfacher, schreibe 0x aus, um dich an die Bedeutung des # Flags zu erinnern.)

+0

Bekommt meine Stimme. Eine viel bessere und gründlichere Abdeckung von 32/64-Bit-Details - insbesondere hinsichtlich der Portabilität. :Daumen hoch: – enhzflep

Verwandte Themen