2012-02-20 62 views
5

khi biên dịch chương trình của tôi với GCC tôi nhận được cảnh báo sau đây là những gì:C dưới dạng viết tắt của unsigned long int

format ‘%d’ expects type ‘int’, but argument 2 has type ‘long unsigned int 

Bây giờ chỉ cần bằng cách chơi xung quanh tôi nhận ra% lo sửa chữa các cảnh báo. Tuy nhiên tôi không thực sự hiểu những gì tôi đang làm.

Có quy ước đặt tên để nhận dạng ngắn của loại không? Ví dụ, int là% d, tại sao ??

Cảm ơn!

+0

Tài liệu luôn là khởi đầu tốt: http://www.cplusplus.com/reference/clibrary/cstdio/printf/ –

Trả lời

1

Tuy nhiên tôi không thực sự hiểu những gì tôi đang làm.

Những gì bạn đang làm đang nói cho hàm printf cách hiển thị dữ liệu mà bạn cung cấp sau chuỗi định dạng. Có thể bạn sẽ thấy rằng %lo không thực sự in kết quả mà bạn mong đợi - nó in đúng dữ liệu, nhưng ở định dạng bát phân (cơ sở 8).

Có quy ước đặt tên để nhận dạng ngắn của loại không? Ví dụ, int là% d, tại sao ??

"Biểu mẫu ngắn" được gọi là trình định dạng định dạng. Không có quy ước nào cho phép bạn lấy được thông số định dạng printf thích hợp. Bạn chỉ cần look them up in an appropriate reference.

22
long unsigned int = unsigned long 

Bạn sử dụng %lu để in chúng.

Và tương tự, %llu là dành cho unsigned long long.


%d - int 
%u - unsigned 
%ld - long 
%lld - long long 
%lu - unsigned long 
%llu - unsigned long long 
3

Không, đó là quy ước, bạn chỉ cần look at the documentation.

Và các trình định dạng định dạng không phải là ánh xạ 1: 1 đối với loại, chúng kiểm soát định dạng đầu ra (do đó tên). Có thể có nhiều định dạng đầu ra cho một loại giá trị đầu vào duy nhất.

Ví dụ: %d là "thập phân", vì nó in một số nguyên làm số thập phân. Ngoài ra còn có %i ("số nguyên") thực hiện chính xác điều tương tự.

Đối với unsigned int giá trị, bạn có cả hai %x (in bằng hệ thập lục phân) và %u (in trong bát phân).

+1

Trên thực tế,% x mong đợi một số nguyên không dấu, không phải là số đã ký ... –

+0

@RichardJ. RossIII: Tốt, cảm ơn. Tôi nên cố vấn một chút thường xuyên hơn, có vẻ như vậy. Đã sửa. – unwind

3

Đị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.

+1

+1, Thật đáng tiếc là những câu trả lời muộn như thế này không nhận được những cuộc nổi dậy mà họ xứng đáng. – Mysticial

0

% lo = số nguyên dài chưa được in được in bằng số bát phân. có, tài liệu là một nơi tốt để bắt đầu .. nhưng somethings có một mô hình, như o cho bát phân, x cho hex, l cho bất cứ điều gì dài vv Bắt được sử dụng để nhiều định dạng như vậy sẽ giúp bạn có được mô hình bất cứ nơi nào có.

Các vấn đề liên quan