2010-07-09 17 views
255

nigdy nie mogę zrozumieć, jak drukować unsigned long typ danych w CJak wydrukowaćf "unsigned long" w C?

Załóżmy unsigned_foo jest unsigned long, potem 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 z nich wydrukować jakiś -123123123 liczby zamiast unsigned long że mam.

Odpowiedz

375

%lu jest prawidłowym formatem dla unsigned long. Wygląda na to, że są tu inne problemy, takie jak uszkodzenie pamięci czy niezainicjowana zmienna. Być może pokaż nam większy obraz?

+5

Ups, '% lu' pracował tym razem. Dzięki. Coś jeszcze musiało się wydarzyć i nie zadziałało. – bodacydo

+0

@bodacydo: Jeśli masz błąd, może pojawić się on częściowo losowo ... upewnij się, że zmienna ma poprawną wartość, zanim spróbujesz go wydrukować. – Thanatos

+1

Nawet jeśli zmienna jest niezainicjowana, nie powinno być żadnego sposobu, aby printf osiągnął punkt, w którym mógłby wydrukować znak minus, gdy specyfikator formatu byłby "% lu". Technicznie jest to niezdefiniowane zachowanie, ale w rzeczywistości zmienna ma nieprzewidywalną wartość, która zostaje przekazana do printf, którego printf następnie interpretuje jako unsigned. Domyślam się, że oryginalnym problemem bodacydo był przepływ do nieprawidłowego wywołania printf zamiast zamierzonego ... –

8

Prawidłowym specyfikatorem dla unsigned long jest %lu.

Jeśli nie otrzymujesz dokładnej wartości, której oczekujesz, może to oznaczać pewne problemy w kodzie.

Proszę skopiować tutaj swój kod. Wtedy może ktoś powie ci lepiej, na czym polega problem.

20

Spośród wszystkich wypróbowanych kombinacji, %ld i %lu są jedynymi prawidłowymi specyfikatorami formatu printf. %lu (długo bez znaku dziesiętnego), %lx lub %lX (długi hex z małymi lub dużymi literami) i %lo (długi ósemkowy) są jedynymi poprawnymi specyfikatorami formatu dla zmiennej typu unsigned long (oczywiście można dodać szerokość pola, precyzję, modyfikatory etc między % i l).

+1

% ld będzie działało poprawnie do wartości std :: numeric_limits :: max()/2. Powyżej tego% ld zostanie wydrukowana błędna wartość (wartość ujemna). –

+1

@KaushikAcharya: Nie, powyżej tego, że to UB. I prawdopodobnie jest to jeszcze UB, ponieważ 'printf' jest określony, aby wymagał dokładnych typów poprawnych argumentów bez uprawnień, które miałby' va_arg'. –

8

Format to %lu.

Proszę sprawdzić o różne inne typy danych i ich wykorzystanie w printf here

+2

Różne niestandardowe zachowanie jest tam dokumentowane bez oznaczania go jako niestandardowego. POSIX jest najłatwiej dostępnym standardem online dla printf; rozszerzenia poza ISO C są oznaczone znacznikiem "CX": http://www.opengroup.org/onlinepubs/9699919799/functions/fprintf.html –

+0

Dzięki, stary! Rozważę to. –

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

Będzie to pomocne. . .

14
  • %lu do unsigned long
  • %llu do unsigned long długi
+5

Konwencja Yoda: "unsigned long" "(l) ong (u) nsigned" jest. –

9

Na int%d

Na długi int%ld

Dla long long int%lld

Dla unsigned long long int%llu