C "imzasız uzun" nasıl yazdırılır?


344

unsigned longC'de veri tipinin nasıl yazdırılacağını asla anlayamıyorum .

Varsayalım unsigned_foobir olduğunu unsigned long, o zaman deneyin:

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

Ve hepsi benim -123123123yerine bir tür numara basar unsigned long.

Yanıtlar:


499

%luiçin doğru biçimdir unsigned long. Burada, bellek bozulması veya başlatılmamış bir değişken gibi başka sorunlar var gibi görünüyor. Belki bize daha büyük bir resim gösterebilir?


12
Hata, %lubu sefer çalıştı. Teşekkürler. Daha önce başka bir şey olmuş olmalı ve işe yaramadı.
bodacydo

1
@bodacydo: Bir hatanız varsa, yarı rastgele görünebilir ... yazdırmayı denemeden önce değişkeninizin geçerli bir değere sahip olduğundan emin olun.
Thanatos

1
Değişken başlatılmamış olsa bile, printf'in biçim belirtici olduğu zaman eksi işareti yazdırabileceği bir noktaya ulaşması mümkün olmamalıdır %lu. Teknik olarak tanımlanmamış bir davranıştır, ancak gerçekte değişken, printf'e aktarılan ve daha sonra printf'in imzasız olarak yorumladığı öngörülemez bir değere sahiptir. Ben bodacydo orijinal sorunu tahmin ediyorum bir amaçlanan yerine yanlış bir printf çağrısı ulaşan akış ... oldu
R .. GitHub DUR YARDIMCI ICE

8
@Anisha Kaul:% lu geçerli bir dönüşüm özellikleri,% ul değil. %lu, ayrılmış: %- bir "dönüşüm belirtimi" başlatır; l- uzunluk değiştirici, l"[unsigned] long int" anlamına gelir; u- dönüşüm belirteci, ubir içindir unsigned intondalık olarak basılabilir. Uzunluk değiştiriciyi verdiğimiz için l, bir kabul eder unsigned long int. Harfler şu sırada olmalıdır : yüzde, uzunluk, dönüşüm. (Genişlik ve hassasiyet gibi ekleyebileceğiniz birkaç seçenek daha var. Tüm bunları tam olarak belgelediği için man sayfasına bakın !)
Thanatos

1
% ul sadece imzasız yazdırır (% u ile) ve sonra "l" harfi kelimesi kelimesine yazılır. Tıpkı "% uw" imzasız, ardından "w" harfiyle yazdırılır. % convspec'i başlatır, u (veya d, s, c ... gibi başka bir karakter) bitirir.
Veky

30
  • %luiçin İşaretsiz uzun
  • %lluiçin işaretsiz uzun uzun

13
Yoda sözleşmesi: "imzasız uzun" "(l) ong (u) imzasız" dır.
Reb.Cabin

28

için int %d

İçin Uzun int %ld

İçin uzun uzun int %lld

İçin işaretsiz uzun uzun int %llu


23

Denediğiniz tüm kombinasyonlardan %ldve %lugeçerli printf format belirteçleri olan tek kombinasyonlardır . %lu(uzun işaretsiz ondalık) %lxveya %lX(küçük harfli veya büyük harfli uzun altıgen) ve %lo(uzun sekizli) işaretsiz uzun tipte bir değişken için tek geçerli biçim tanımlayıcılarıdır (elbette arasına alan genişliği, kesinlik vb. değiştiriciler ekleyebilirsiniz. %ve l).


1
% ld, std :: numeric_limits <unsigned long> :: max () / 2 değerine kadar iyi çalışır. Bunun üzerinde% ld yanlış değer (negatif değer) yazdıracaktır.
Kaushik Acharya

1
@KaushikAcharya: Hayır, bunun üstünde UB var. Ve muhtemelen bundan önce UB bile, çünkü sahip printfolunan ödenekler olmadan tam doğru argüman türlerini gerektirdiği belirtildi va_arg.
R .. GitHub DURDURMA BUZA YARDIM ET

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

Bu yardımcı olacaktır. . .



8

İmzasız uzun süre için doğru tanımlayıcıdır %lu.

Beklediğiniz değeri tam olarak alamıyorsanız, kodunuzda bazı sorunlar olabilir.

Lütfen kodunuzu buraya kopyalayın. O zaman belki birisi size sorunun ne olduğunu daha iyi söyleyebilir.


-5

Ben de aynı problemi yaşadım. "% Ul" deneyin, benim için çalışıyor.


6
Bu soru 8 yıldan fazla bir süre önce kapsamlı bir şekilde cevaplandı. Lütfen yeni bir cevabın yeni bilgiler eklediğinden ve daha da önemlisi doğru olduğundan emin olun.
Gerhardh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.