printfFonksiyonu gibi bir argüman türü alır %dveya %ibir için signed int. Ancak, longdeğer için hiçbir şey görmüyorum .
printfFonksiyonu gibi bir argüman türü alır %dveya %ibir için signed int. Ancak, longdeğer için hiçbir şey görmüyorum .
Yanıtlar:
lDoğrudan belirtecin önüne bir (küçük harf L) koyun .
unsigned long n;
long m;
printf("%lu %ld", n, m);
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 .
%ldOP sorusu ile daha uyumlu olacak şekilde değiştirmelisiniz .
%ltetiklerwarning: unknown conversion type character 0x20 in format [-Wformat]
Bence demek istedin ki:
unsigned long n;
printf("%lu", n); // unsigned long
veya
long n;
printf("%ld", n); // signed long
Ç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ı
long32 boyutunda bir platform var" olduğundan emin değilim . Örneğin, Oracle Linux x86_64 / amd64 çıkıyorum ve birlikte nvccbir long8 bayt.
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).
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.