Đối số cho printf định dạng dài là gì?


Câu trả lời:


634

Đặt một l(chữ cái viết tắt L) trực tiếp trước bộ xác định.

unsigned long n;
long m;

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

14
printf("%ld", ULONG_MAX)xuất giá trị là -1. Nên printf("%lu", ULONG_MAX)để dài không dấu như được mô tả bởi @Blorgbeard bên dưới.
jammus

2
Trên thực tế, bạn nên thay đổi nó %ldđể trở nên hài hòa hơn với câu hỏi OP.
Bác sĩ Beco

Yep Dr Beco; hơn nữa, chỉ cần %lkích hoạtwarning: unknown conversion type character 0x20 in format [-Wformat]
Patrizio Bertoni

190

Tôi nghĩ bạn muốn nói:

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

hoặc là

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

73

Trên hầu hết các nền tảng longintcó cùng kích thước (32 bit). Tuy nhiên, nó có định dạng định dạng riêng của nó:

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

Đối với 64 bit, bạn muốn có long long:

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

Ồ, và tất nhiên, nó khác với Windows:

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

Thông thường, khi tôi in các giá trị 64 bit, tôi thấy hữu ích khi in chúng ở dạng hex (thường với các số lớn, chúng là các con trỏ hoặc các trường bit).

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

sẽ in:

0x00000000DEADBEEF

Btw, "dài" không có nghĩa là nhiều nữa (trên dòng chính x64). "int" là kích thước int mặc định của nền tảng, thường là 32 bit. "dài" thường có cùng kích thước. Tuy nhiên, chúng có ngữ nghĩa di động khác nhau trên các nền tảng cũ hơn (và các nền tảng nhúng hiện đại!). "Long long" là một số 64 bit và thường là những gì mọi người muốn sử dụng trừ khi họ thực sự biết họ đang làm gì để chỉnh sửa một đoạn mã di động nền tảng x. Thậm chí sau đó, họ có thể đã sử dụng một macro thay vì nắm bắt ý nghĩa ngữ nghĩa của loại (ví dụ 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 

Ngày trước, "int" là 16 bit. Bạn nghĩ rằng bây giờ sẽ là 64 bit, nhưng không, điều đó sẽ gây ra các vấn đề về tính di động điên rồ. Tất nhiên, ngay cả điều này là một sự đơn giản hóa của sự thật phức tạp và giàu lịch sử. Xem wiki: Số nguyên


@MM Tôi đã làm rõ câu trả lời của mình để tránh nhầm lẫn.
Dave Dopson

4
Chỉ cần làm rõ: có nhiều kiến ​​trúc hơn x86 và x64, và trên các kiến ​​trúc đó, char, short, int, long và long có ý nghĩa khác nhau. Ví dụ: mcu 32 bit với căn chỉnh bộ nhớ 16 bit có thể sử dụng: char = short = int = 16 bit; dài = 32 bit; dài dài = 64 bit
AndresR

1
@AndresR - hoàn toàn, và nó rất quan trọng đối với những người làm lập trình nhúng (tôi đã xây dựng một mô-đun hạt nhân cho thiết bị báo khói một lần). Đáng tiếc cho những tâm hồn tội nghiệp khi họ cố gắng sử dụng mã không được viết cho tính di động.
Dave Dopson

Tôi không chắc chắn rằng "hầu hết các nền tảng có longkích thước 32" vẫn đúng. Ví dụ: tôi đang dùng Oracle Linux x86_64 / amd64 và với nvcca longlà 8 byte.
ragerdl

"Ồ, và tất nhiên, nó khác với Windows". Có một giải pháp đa nền tảng?
Aaron Franke

17

Nó phụ thuộc, nếu bạn đang đề cập đến ký tự dài không dấu thì ký tự định dạng là "%lu". Nếu bạn đang đề cập đến ký dài, ký tự định dạng là "%ld".



12

Trong trường hợp bạn đang muốn in unsigned long longnhư tôi, hãy sử dụng:

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

Đối với tất cả các kết hợp khác, tôi tin rằng bạn sử dụng bảng từ hướng dẫn printf , lấy hàng, sau đó là nhãn cột cho bất kỳ loại nào bạn đang cố gắng in (như tôi đã làm printf("%llu", n)ở trên).


0

Tôi nghĩ rằng để trả lời câu hỏi này một cách dứt khoát sẽ yêu cầu biết tên và phiên bản trình biên dịch mà bạn đang sử dụng và nền tảng (loại CPU, HĐH, v.v.) mà nó đang biên dịch.


Câu trả lời của bạn nên là một nhận xét và không phải là một câu trả lời.
Jaime Hablutzel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.