Như AraK đã nói, giao diện luồng c ++ sẽ luôn hoạt động tốt.
std :: size_t s = 1024; std :: cout << s; // hoặc bất kỳ loại luồng nào khác như chuỗi dòng!
Nếu bạn muốn C stdio, không có câu trả lời di động nào cho điều này đối với một số trường hợp "di động". Và nó trở nên xấu xí như bạn đã thấy, chọn các cờ định dạng sai có thể đưa ra cảnh báo trình biên dịch hoặc đưa ra đầu ra không chính xác.
C99 đã cố gắng giải quyết vấn đề này bằng các định dạng inttypes.h như "%" PRIdMAX "\ n". Nhưng cũng giống như "% zu", không phải ai cũng hỗ trợ c99 (như MSVS trước năm 2013). Có các tệp "msinttypes.h" nổi xung quanh để giải quyết vấn đề này.
Nếu bạn chuyển sang một loại khác, tùy thuộc vào cờ, bạn có thể nhận được cảnh báo của trình biên dịch để cắt bớt hoặc thay đổi dấu hiệu. Nếu bạn đi tuyến đường này chọn một loại kích thước cố định có liên quan lớn hơn. Một trong những ký tự dài không dấu và "% llu" hoặc dài không dấu "% lu" sẽ hoạt động, nhưng llu cũng có thể làm mọi thứ chậm lại trong một thế giới 32 bit quá lớn. (Chỉnh sửa - mac của tôi đưa ra cảnh báo trong 64 bit cho% llu không khớp với size_t, mặc dù% lu,% llu và size_t đều có cùng kích thước. Và% lu và% llu không cùng kích thước trên MSVS2012 của tôi. bạn có thể cần truyền + sử dụng định dạng phù hợp.)
Đối với vấn đề đó, bạn có thể đi với các loại kích thước cố định, chẳng hạn như int64_t. Nhưng chờ đã! Bây giờ chúng tôi trở lại c99 / c ++ 11 và MSVS cũ lại thất bại. Ngoài ra, bạn cũng có các phôi (ví dụ map.size () không phải là loại kích thước cố định)!
Bạn có thể sử dụng tiêu đề hoặc thư viện của bên thứ 3 như boost. Nếu bạn chưa sử dụng một cái, bạn có thể không muốn thổi phồng dự án của mình theo cách đó. Nếu bạn sẵn sàng thêm một chỉ cho vấn đề này, tại sao không sử dụng các luồng c ++ hoặc biên dịch có điều kiện?
Vì vậy, bạn đang xuống các luồng c ++, biên dịch có điều kiện, khung bên thứ 3 hoặc một loại di động nào đó phù hợp với bạn.
unsigned long
là tùy chọn tốt nhất nếu việc triển khai libc của bạn không hỗ trợ công cụz
sửa đổi; tiêu chuẩn C99 khuyến nghịsize_t
không nên có thứ hạng chuyển đổi số nguyên lớn hơnlong
, vì vậy bạn an toàn một cách hợp lý