Các printf
chức năng phải mất một kiểu tham số, chẳng hạn như %d
hoặc %i
cho một signed int
. Tuy nhiên, tôi không thấy bất cứ điều gì cho một long
giá trị.
Các printf
chức năng phải mất một kiểu tham số, chẳng hạn như %d
hoặc %i
cho một signed int
. Tuy nhiên, tôi không thấy bất cứ điều gì cho một long
giá trị.
Câu trả lời:
Đặ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);
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.
%ld
để trở nên hài hòa hơn với câu hỏi OP.
%l
kích hoạtwarning: unknown conversion type character 0x20 in format [-Wformat]
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
Trên hầu hết các nền tảng long
và int
có 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
long
kích thước 32" vẫn đúng. Ví dụ: tôi đang dùng Oracle Linux x86_64 / amd64 và với nvcc
a long
là 8 byte.
Trong trường hợp bạn đang muốn in unsigned long long
như 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).
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.