printf
Funkcji zajmuje typu parametru, jak %d
i %i
dla signed int
. Jednak nie widzę nic dla long
wartości.
printf
Funkcji zajmuje typu parametru, jak %d
i %i
dla signed int
. Jednak nie widzę nic dla long
wartości.
Odpowiedzi:
Umieść l
(małą literę L) bezpośrednio przed specyfikatorem.
unsigned long n;
long m;
printf("%lu %ld", n, m);
printf("%ld", ULONG_MAX)
zwraca wartość jako -1. Powinny pozostać printf("%lu", ULONG_MAX)
bez znaku tak długo, jak opisano poniżej przez @Blorgbeard.
%ld
, aby było bardziej harmonijne z pytaniem OP.
%l
wyzwalawarning: unknown conversion type character 0x20 in format [-Wformat]
Myślę, że chodzi Ci o:
unsigned long n;
printf("%lu", n); // unsigned long
lub
long n;
printf("%ld", n); // signed long
W większości platformach long
i int
są tej samej wielkości (32 bity). Mimo to ma swój własny specyfikator formatu:
long n;
unsigned long un;
printf("%ld", n); // signed
printf("%lu", un); // unsigned
Dla 64 bitów potrzebujesz long long
:
long long n;
unsigned long long un;
printf("%lld", n); // signed
printf("%llu", un); // unsigned
No i oczywiście jest inaczej w systemie Windows:
printf("%l64d", n); // signed
printf("%l64u", un); // unsigned
Często, gdy drukuję wartości 64-bitowe, pomocne jest wydrukowanie ich w systemie szesnastkowym (zwykle z tak dużymi liczbami, są to wskaźniki lub pola bitowe).
unsigned long long n;
printf("0x%016llX", n); // "0x" followed by "0-padded", "16 char wide", "long long", "HEX with 0-9A-F"
wydrukuje:
0x00000000DEADBEEF
Btw, „long” nie znaczy już tyle (na głównym nurcie x64). „int” to domyślny rozmiar int platformy, zwykle 32 bity. „długi” ma zwykle ten sam rozmiar. Mają jednak inną semantykę przenośności na starszych platformach (i nowoczesnych platformach wbudowanych!). „long long” to liczba 64-bitowa i zwykle to, co ludzie zamierzali użyć, chyba że naprawdę wiedzieli, co robią, edytując kawałek przenośnego kodu na platformę x. Nawet wtedy prawdopodobnie użyliby makra, aby uchwycić semantyczne znaczenie tego typu (np. 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
W tamtym czasie „int” miał 16 bitów. Można by pomyśleć, że będzie to teraz 64 bity, ale nie, to spowodowałoby szalone problemy z przenośnością. Oczywiście nawet to jest uproszczeniem tajemnej i bogatej historii prawdy. Zobacz wiki: Liczba całkowita
long
rozmiar 32” jest nadal prawdą. Na przykład, jestem na Oracle Linux x86_64 / amd64 iz wynosi 8 bajtów. nvcc
long
%ld
patrz printf
odnośnik na cplusplus.com
Jeśli chcesz wydrukować unsigned long long
tak jak ja, użyj:
unsigned long long n;
printf("%llu", n);
Wydaje mi się, że we wszystkich innych kombinacjach używasz tabeli z instrukcji printf , biorąc wiersz, a następnie etykietę kolumny dla dowolnego typu, który próbujesz wydrukować (tak jak printf("%llu", n)
powyżej).
Myślę, że ostateczne udzielenie odpowiedzi na to pytanie wymagałoby znajomości nazwy i wersji kompilatora, której używasz, oraz platformy (typ procesora, system operacyjny itp.), Dla której się kompiluje.