Wie drucke ich in C "unsigned long"?


342

Ich kann nie verstehen, wie man einen unsigned longDatentyp in C druckt .

Angenommen, es unsigned_fooist ein unsigned long, dann versuche ich:

  • printf("%lu\n", unsigned_foo)
  • printf("%du\n", unsigned_foo)
  • printf("%ud\n", unsigned_foo)
  • printf("%ll\n", unsigned_foo)
  • printf("%ld\n", unsigned_foo)
  • printf("%dl\n", unsigned_foo)

Und alle drucken -123123123stattdessen eine Nummer unsigned long, die ich habe.

Antworten:


499

%luist das richtige Format für unsigned long. Klingt so, als ob hier andere Probleme im Spiel sind, wie z. B. Speicherbeschädigung oder eine nicht initialisierte Variable. Zeigen Sie uns vielleicht ein größeres Bild?


12
Hoppla, %ludiesmal gearbeitet. Vielen Dank. Etwas anderes muss vorher passiert sein und es hat nicht funktioniert.
Bodacydo

1
@bodacydo: Wenn Sie einen Fehler haben, wird dieser möglicherweise halb zufällig angezeigt. Stellen Sie sicher, dass Ihre Variable einen gültigen Wert hat, bevor Sie versuchen, sie zu drucken.
Thanatos

1
Selbst wenn die Variable nicht initialisiert ist, sollte printf auf keinen Fall einen Punkt erreichen, an dem ein Minuszeichen gedruckt werden kann, wenn der Formatbezeichner war %lu. Technisch gesehen ist es ein undefiniertes Verhalten, aber in Wirklichkeit hat die Variable einen unvorhersehbaren Wert, der an printf übergeben wird, den printf dann als vorzeichenlos interpretiert. Ich vermute, Bodacydos ursprüngliches Problem war, dass der Fluss einen falschen printf-Aufruf anstelle des beabsichtigten erreichte ...
R .. GitHub STOP HELPING ICE

8
@ Anisha Kaul:% lu ist eine gültige Konvertierungsspezifikation,% ul nicht. %lu, ausgebrochen ist: %- startet eine "Konvertierungsspezifikation"; l- der Längenmodifikator lbedeutet "[unsigned] long int"; u- Der Konvertierungsspezifizierer udient zum unsigned intAusdrucken als Dezimalzahl. Da wir den Längenmodifikator angegeben haben l, akzeptiert er dann einen unsigned long int. Die Buchstaben müssen in dieser Reihenfolge sein: Prozent, Länge, Umrechnung. (Es gibt ein paar weitere Optionen, wie Breite und Präzision, die Sie hinzufügen können. Siehe die Manpage , da sie all dies genau dokumentiert!)
Thanatos

1
% ul druckt nur ohne Vorzeichen (mit% u) und dann den Buchstaben "l" wörtlich. So wie "% uw" ohne Vorzeichen gedruckt wird, gefolgt vom Buchstaben "w". % startet die Convspec, u (oder ein anderes Zeichen wie d, s, c ...) beendet sie.
Veky

30
  • %lufür unsignierte lange
  • %llufür unsigned long long

13
Yoda-Konvention: "unsigned long" "(l) ong (u) nsigned" ist.
Reb.Cabin

28

Für int %d

Für lange int %ld

Für lange lange int %lld

Für unsigned long long int %llu


23

Aus allen Kombinationen versucht sie, %ldund %lusind die einzigen, die gültige printf Formatbezeichüberhaupt sind. %lu(lange vorzeichenlose Dezimalzahl) %lxoder %lX(langes Hex mit Klein- oder Großbuchstaben) und %lo(langes Oktal) sind die einzigen gültigen Formatbezeichner für eine Variable vom Typ vorzeichenlose lange (natürlich können Sie Feldbreiten-, Genauigkeits- usw. Modifikatoren zwischen den Modifikatoren hinzufügen %und die l).


1
% ld funktioniert einwandfrei, bis der Wert von std :: numeric_limits <unsigned long> :: max () / 2 erreicht ist. Darüber hinaus gibt% ld einen falschen Wert aus (negativer Wert).
Kaushik Acharya

1
@ KaushikAcharya: Nein, darüber hinaus ist es UB. Und es ist wohl sogar UB davor, da printfangegeben wird, dass die genau richtigen Argumenttypen ohne die zulässigen Zulagen erforderlich va_argsind.
R .. GitHub STOP HELPING ICE

9
int main()
{
    unsigned long long d;
    scanf("%llu",&d);
    printf("%llu",d);
    getch();
}

Dies wird hilfreich sein. . .


9

Das Format ist %lu.

Bitte überprüfen Sie über die verschiedenen anderen Datentypen und deren Verwendung in printf hier


2
Dort werden verschiedene nicht standardmäßige Verhaltensweisen dokumentiert, ohne sie als nicht standardmäßig zu kennzeichnen. POSIX ist der am einfachsten zugängliche Online-Standard für printf. Erweiterungen über ISO C hinaus sind mit dem Tag "CX" gekennzeichnet: opengroup.org/onlinepubs/9699919799/functions/fprintf.html
R .. GitHub STOP HELPING ICE

8

Der richtige Bezeichner für unsigned long ist %lu.

Wenn Sie nicht den genauen Wert erhalten, den Sie erwarten, kann es zu Problemen in Ihrem Code kommen.

Bitte kopieren Sie Ihren Code hier. Dann kann Ihnen vielleicht jemand besser sagen, wo das Problem liegt.


-5

Ich hatte das gleiche Problem. Versuchen Sie "% ul", es funktioniert für mich.


6
Diese Frage wurde vor mehr als 8 Jahren ausführlich beantwortet. Bitte stellen Sie sicher, dass eine neue Antwort neue Informationen hinzufügt und wichtiger noch richtig ist.
Gerhardh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.