printf
Fonksiyonu gibi bir argüman türü alır %d
veya %i
bir için signed int
. Ancak, long
değer için hiçbir şey görmüyorum .
printf
Fonksiyonu gibi bir argüman türü alır %d
veya %i
bir için signed int
. Ancak, long
değer için hiçbir şey görmüyorum .
Yanıtlar:
l
Doğ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 .
%ld
OP sorusu ile daha uyumlu olacak şekilde değiştirmelisiniz .
%l
tetiklerwarning: 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 long
ve int
aynı 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ı
long
32 boyutunda bir platform var" olduğundan emin değilim . Örneğin, Oracle Linux x86_64 / amd64 çıkıyorum ve birlikte nvcc
bir long
8 bayt.
unsigned long long
Benim 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.