Uzun formatlı printf argümanı nedir?


Yanıtlar:


634

lDoğrudan belirtecin önüne bir (küçük harf L) koyun .

unsigned long n;
long m;

printf("%lu %ld", n, m);

14
printf("%ld", ULONG_MAX)değeri -1 olarak verir. printf("%lu", ULONG_MAX)Aşağıda @Blorgbeard tarafından açıklandığı gibi imzasız olması gerekir .
jammus

2
Aslında, %ldOP sorusu ile daha uyumlu olacak şekilde değiştirmelisiniz .
Dr Beco

Yep Dr Beco; daha fazla, sadece %ltetiklerwarning: unknown conversion type character 0x20 in format [-Wformat]
Patrizio Bertoni

190

Bence demek istedin ki:

unsigned long n;
printf("%lu", n);   // unsigned long

veya

long n;
printf("%ld", n);   // signed long

73

Çoğu platformda longve intaynı boyuttadır (32 bit). Yine de, kendi format belirleyicisi var:

long n;
unsigned long un;
printf("%ld", n); // signed
printf("%lu", un); // unsigned

64 bit için aşağıdakileri istersiniz long long:

long long n;
unsigned long long un;
printf("%lld", n); // signed
printf("%llu", un); // unsigned

Oh, ve tabii ki, Windows'da farklı:

printf("%l64d", n); // signed
printf("%l64u", un); // unsigned

Sıklıkla, 64 bit değerleri yazdırırken, bunları onaltılı olarak yazdırmayı yararlı buluyorum (genellikle büyük sayılarla, bunlar işaretçiler veya bit alanlarıdır).

unsigned long long n;
printf("0x%016llX", n); // "0x" followed by "0-padded", "16 char wide", "long long", "HEX with 0-9A-F"

yazdıracak:

0x00000000DEADBEEF

Btw, "uzun" artık çok fazla bir şey ifade etmiyor (ana akım x64'te). "int", platformun varsayılan int boyutu, genellikle 32 bittir. "uzun" genellikle aynı boyuttadır. Bununla birlikte, eski platformlarda (ve modern gömülü platformlarda!) Farklı taşınabilirlik semantiğine sahiptirler. "uzun uzun", 64-bit bir sayıdır ve genellikle x-platform taşınabilir kod parçasını düzenlemek için ne yaptıklarını gerçekten bilmedikleri sürece insanların kullanmak istedikleri şeydir. O zaman bile, muhtemelen türün anlamsal anlamını yakalamak için bir makro kullanırlardı (örneğin uint64_t).

char c;       // 8 bits
short s;      // 16 bits
int i;        // 32 bits (on modern platforms)
long l;       // 32 bits
long long ll; // 64 bits 

Gün içinde "int" 16 bitti. Artık 64 bit olacağını düşünürdünüz, ancak hayır, bu delilik taşınabilirlik sorunlarına neden olurdu. Tabii ki, bu bile gizli ve tarih açısından zengin gerçeğin basitleştirilmesidir. Bkz. Wiki: Tamsayı


@MM Karışıklığı önlemek için cevabımı açıkladım.
Dave Dopson

4
Açıklığa kavuşturmak için: x86 ve x64'ten daha fazla mimarlık vardır ve bu mimarilerde char, short, int, long ve long long'un farklı anlamları vardır. Örneğin, 16 bit bellek hizalamalı 32 bit mcu şunları kullanabilir: char = short = int = 16 bit; uzun = 32 bit; uzun uzun = 64 bit
AndresR

1
@AndresR - kesinlikle, ve gömülü programlama yapan insanlar için çok derinden önemlidir (Bir kez duman alarmı için bir çekirdek modülü oluşturdum). Bu zavallı ruhlara, taşınabilirlik için yazılmamış kod kullanmaya çalıştıklarında acıma.
Dave Dopson

"Çoğu platformda long32 boyutunda bir platform var" olduğundan emin değilim . Örneğin, Oracle Linux x86_64 / amd64 çıkıyorum ve birlikte nvccbir long8 bayt.
ragerdl

"Oh, ve tabii ki, Windows'da farklı". Platformlar arası bir çözüm var mı?
Aaron Franke

17

Bu, imzasız uzun bir süre için başvuruyorsanız, biçimlendirme karakterine bağlıdır "%lu". Uzun süre imzalı olarak başvuruyorsanız, biçimlendirme karakteri "%ld".



12

unsigned long longBenim gibi yazdırmak istiyorsanız , şunu kullanın:

unsigned long long n;
printf("%llu", n);

Diğer tüm kombinasyonlar için, printf kılavuzundaki tabloyu , satırı alarak, ardından yazdırmaya çalıştığınız her tür için sütun etiketini kullandığınıza inanıyorum (yukarıda yaptığım printf("%llu", n)gibi).


0

Bu soruyu kesin olarak cevaplamak için kullandığınız derleyici adını ve sürümünü ve derlediği platformu (CPU tipi, işletim sistemi vb.) Bilmek gerekir.


Cevabınız tek başına bir yorum değil, bir yorum olmalıdır.
Jaime Hablutzel
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.