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.

bodacydo
quelle

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?

Thanatos
quelle
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
NealCaffery
quelle
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

Linkon
quelle
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).

R .. GitHub HÖREN SIE AUF, EIS ZU HELFEN
quelle
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. . .

Sanjith Bravo Dastan
quelle
9

Das Format ist %lu.

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

Praveen S.
quelle
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.

Kumar Alok
quelle
-5

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

Joseleo
quelle
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