Định nghĩa của int, dài, v.v ... cụ thể cho mục tiêu. Nếu kích thước của int và long match sau đó là
printf("%d",var);
không phàn nàn, nhưng nếu dài 64 bit và int là 32 bit, bạn sẽ nhận được cảnh báo/lỗi mà bạn mô tả. Một trong hai giải pháp:
printf("%ld",var);
or
printf("%d",(int)var);
Sau đó, bạn phải đảm bảo rằng trình biên dịch liên kết int với kích thước% d nếu bạn nhận được cảnh báo khác sau đó điều chỉnh cho phù hợp.
EDIT:
Trình biên dịch đang cố gắng để giúp bạn ra ngoài, bởi lo lắng về C thư viện thứ mà không phải là thực sự kinh doanh của trình biên dịch. printf() sử dụng một số biến đối số, hy vọng bạn đã khớp đúng với chuỗi định dạng của bạn. Khi printf thấy một% d trên nói một hệ thống 32 bit, nó có khả năng sẽ chỉ lấy đối số 32 bit tiếp theo. Nhưng nếu bạn đã đặt một số nguyên 64 bit vào như một tham số, nó có thể lấy một nửa số nguyên đó và sử dụng nửa còn lại làm mục tiếp theo trong chuỗi định dạng. Ví dụ
unsigned long ul;
float f;
f=3.4;
ul=0x3F9DF3B612345678;
...
printf("%X %f\n",ul,f);
Tùy thuộc vào hệ thống của bạn, endianess, vv, một hệ thống 32 bit, bạn không nên chút nào ngạc nhiên nếu các mã trên tạo ra sản lượng này:
12345678 1.234000
bởi vì đó là những gì bạn nói nó đến. bạn đã nói với nó để lấy 32 bit thấp hơn của ul và in đó như hex (% X) và trên 32 bit của ul và in đó là float (% f) và đặt f trong hàm gọi là một sự lãng phí mà bạn không cung cấp định dạng để sử dụng giá trị dấu phẩy động.
Bây giờ tùy thuộc vào trình biên dịch trên hệ thống đích vào một ngày cụ thể mà bạn có thể có mã ở trên hoạt động như mong muốn, hãy lấy một hệ thống/trình biên dịch không có dấu dài được hiểu là 32 bit và% X được hiểu là 32 bit, sau đó bạn nhận được một cảnh báo về việc gán 64 bit nhưng printf có ý nghĩa hơn một chút.
Vì nỗi đau này, các trình biên dịch như gcc bận tâm cố gắng cải thiện cuộc sống của bạn bằng cách giả sử rằng khi bạn sử dụng hàm printf(), bạn đang sử dụng hàm C chuẩn và phân tích chuỗi định dạng của bạn những sai lầm phổ biến.
Tài liệu luôn là khởi đầu tốt: http://www.cplusplus.com/reference/clibrary/cstdio/printf/ –