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.

bodacydo
źródło

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?

Tanatos
źródło
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
NealCaffery
źródło
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

Linkon
źródło
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).

R .. GitHub ZATRZYMAJ LOD
źródło
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
9
int main()
{
    unsigned long long d;
    scanf("%llu",&d);
    printf("%llu",d);
    getch();
}

To będzie pomocne. . .

Sanjith Bravo Dastan
źródło
9

Format to %lu.

Sprawdź różne inne typy danych i ich użycie w printf tutaj

Praveen S.
źródło
2
Udokumentowano tam różne niestandardowe zachowania bez oznaczania go jako niestandardowego. POSIX jest najłatwiej dostępnym standardem online dla printf; rozszerzenia poza ISO C są oznaczone znacznikiem „CX”: opengroup.org/onlinepubs/9699919799/functions/fprintf.html
R .. GitHub STOP HELPING ICE
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.

Kumar Alok
źródło
-5

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

Joseleo
źródło
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