Jaki argument przemawia za printf, który formatuje długi?


Odpowiedzi:


633

Umieść l(małą literę L) bezpośrednio przed specyfikatorem.

unsigned long n;
long m;

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

14
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.
jammus

2
Właściwie powinieneś to zmienić %ld, aby było bardziej harmonijne z pytaniem OP.
Dr Beco

Tak Dr Beco; dalej tylko %lwyzwalawarning: unknown conversion type character 0x20 in format [-Wformat]
Patrizio Bertoni

189

Myślę, że chodzi Ci o:

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

lub

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

73

W większości platformach longi intsą 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


@MM Wyjaśniłem swoją odpowiedź, aby uniknąć nieporozumień.
Dave Dopson,

4
Aby wyjaśnić: istnieje więcej architektur niż x86 i x64, a na tych architekturach char, short, int, long i long long mają różne znaczenia. Na przykład 32-bitowy mcu z 16-bitowym wyrównaniem pamięci może użyć: char = short = int = 16 bit; długi = 32 bity; długi długi = 64 bity
AndresR

1
@AndresR - absolutnie i ma to bardzo duże znaczenie dla osób, które wykonują programowanie osadzone (raz zbudowałem moduł jądra dla alarmu przeciwpożarowego). Szkoda tym biednym duszom, gdy próbują użyć kodu, który nie został napisany z myślą o przenośności.
Dave Dopson,

Nie jestem pewien, czy „większość platform ma longrozmiar 32” jest nadal prawdą. Na przykład, jestem na Oracle Linux x86_64 / amd64 iz wynosi 8 bajtów. nvcclong
ragerdl

„Och, i oczywiście jest inaczej w systemie Windows”. Czy istnieje rozwiązanie wieloplatformowe?
Aaron Franke

17

To zależy, jeśli masz na myśli niepodpisany długi znak formatowania "%lu". Jeśli masz na myśli podpisany długi znak formatowania to "%ld".



12

Jeśli chcesz wydrukować unsigned long longtak 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).


0

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.


Twoja odpowiedź powinna być komentarzem, a nie odpowiedzią samą w sobie.
Jaime Hablutzel,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.