Jak wydrukować „C bez znaku” w C?


344

Nigdy nie rozumiem, jak wydrukować unsigned longtyp danych w C.

Załóżmy, że unsigned_foojest unsigned long, a następnie próbuję:

  • 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)

I wszystkie drukują jakiś -123123123numer zamiast tego, unsigned longktóry mam.

Odpowiedzi:


499

%lujest poprawnym formatem dla unsigned long. Wygląda na to, że występują tu inne problemy, takie jak uszkodzenie pamięci lub niezainicjowana zmienna. Może pokaż nam większy obraz?


12
Ups, %lutym razem pracowałem. Dzięki. Coś jeszcze musiało się wydarzyć wcześniej i to nie działało.
bodacydo

1
@ bodacydo: Jeśli masz błąd, może pojawić się w połowie losowo ... upewnij się, że twoja zmienna ma prawidłową wartość, zanim spróbujesz ją wydrukować.
Thanatos,

1
Nawet jeśli zmienna nie jest zainicjowana, printf nie może osiągnąć punktu, w którym mógłby wydrukować znak minus, gdy specyfikator formatu był %lu. Technicznie jest to nieokreślone zachowanie, ale w rzeczywistości zmienna ma nieprzewidywalną wartość, która jest przekazywana do printf, które następnie printf interpretuje jako niepodpisane. Domyślam się, że pierwotnym problemem bodacydo był przepływ dochodzący do nieprawidłowego wywołania printf zamiast zamierzonego ...
R .. GitHub ZATRZYMAJ LODĘ

8
@Anisha Kaul:% lu jest prawidłową specyfikacją konwersji,% ul nie. %lu, rozbite to: %- uruchamia „specyfikację konwersji”; l- modyfikator długości loznacza „[bez znaku] long int”; u- specyfikator konwersji uma unsigned intbyć drukowany w systemie dziesiętnym. Ponieważ podaliśmy modyfikator długości l, wówczas akceptuje on unsigned long int. Litery muszą być w następującej kolejności: procent, długość, konwersja. (Istnieje kilka dodatkowych opcji, takich jak szerokość i precyzja, które można dodać. Zobacz stronę podręcznika man , ponieważ dokładnie to wszystko dokumentuje!)
Thanatos

1
% ul wypisze po prostu niepodpisany (z% u), a następnie dosłownie litera „l”. Podobnie jak „% uw” wypisze niepodpisany, a po nim litera „w”. % rozpoczyna convspec, u (lub inny znak, np. d, s, c ...) kończy go.
Veky

30
  • %luna długo bez znaku
  • %lluprzez długi czas bez znaku

13
Konwencja Yoda: „unsigned long” „(l) ong (u) nsigned” to.
Reb.Cabin

28

Dla int %d

Na długi int %ld

Na długi długi int %lld

Dla bez znaku long long int %llu


23

Spośród wszystkich kombinacji, które wypróbowałeś, %ldi %lusą to jedyne, które w ogóle są poprawnymi specyfikatorami formatu printf. %lu(długi dziesiętny bez znaku) %lxlub %lX(długi szesnastkowy z małymi lub dużymi literami) i %lo(długi ósemkowy) są jedynymi prawidłowymi specyfikatorami formatu dla zmiennej typu bez znaku długiego (oczywiście można dodać modyfikatory szerokości pola, precyzji itp. między %i l).


1
% ld będzie działał dobrze, dopóki wartość std :: numeric_limits <unsigned long> :: max () / 2. Powyżej tego% ld wypisze nieprawidłową wartość (wartość ujemna).
Kaushik Acharya

1
@KaushikAcharya: Nie, powyżej jest to UB. Prawdopodobnie nawet wcześniej UB, ponieważ printfokreślono, że wymaga dokładnych poprawnych typów argumentów bez przydziałów va_arg.
R .. GitHub ZATRZYMAJ LÓD



8

Prawidłowy specyfikator dla długiego bez znaku to %lu.

Jeśli nie otrzymujesz dokładnie oczekiwanej wartości, mogą wystąpić problemy z kodem.

Skopiuj swój kod tutaj. Może ktoś może lepiej powiedzieć, na czym polega problem.


-5

Miałem ten sam problem. Spróbuj „% ul”, to działa dla mnie.


6
Odpowiedzi na to pytanie udzielono obszernie ponad 8 lat temu. Pleae zapewniają, że nowa odpowiedź dodaje nowe informacje, a co ważniejsze, jest nawet poprawna.
Gerhardh
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.