Nigdy nie rozumiem, jak wydrukować unsigned long
typ danych w C.
Załóżmy, że unsigned_foo
jest 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ś -123123123
numer zamiast tego, unsigned long
który mam.
c
printf
long-integer
unsigned
format-specifiers
bodacydo
źródło
źródło
%lu
tym razem pracowałem. Dzięki. Coś jeszcze musiało się wydarzyć wcześniej i to nie działało.%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 ...%lu
, rozbite to:%
- uruchamia „specyfikację konwersji”;l
- modyfikator długościl
oznacza „[bez znaku] long int”;u
- specyfikator konwersjiu
maunsigned int
być drukowany w systemie dziesiętnym. Ponieważ podaliśmy modyfikator długościl
, wówczas akceptuje onunsigned 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!)%lu
na długo bez znaku%llu
przez długi czas bez znakuźródło
Dla int
%d
Na długi int
%ld
Na długi długi int
%lld
Dla bez znaku long long int
%llu
źródło
Spośród wszystkich kombinacji, które wypróbowałeś,
%ld
i%lu
są to jedyne, które w ogóle są poprawnymi specyfikatorami formatu printf.%lu
(długi dziesiętny bez znaku)%lx
lub%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%
il
).źródło
printf
określono, że wymaga dokładnych poprawnych typów argumentów bez przydziałówva_arg
.To będzie pomocne. . .
źródło
Format to
%lu
.Sprawdź różne inne typy danych i ich użycie w printf tutaj
źródło
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.
źródło
Miałem ten sam problem. Spróbuj „% ul”, to działa dla mnie.
źródło