Câu hỏi của tôi bắt nguồn từ việc cố gắng sử dụng printf để ghi lại mọi thứ khi cố gắng xây dựng cho nhiều nền tảng có độ sâu bit (ví dụ: 32/64).Có nguy hiểm khi quảng bá các loại trong đối số printf không?
Một vấn đề tiếp tục nuôi đầu xấu xí của nó là cố gắng in ints trên nhiều kiến trúc. Trên 32 bit nó sẽ là một cái gì đó giống như
printf(" my int: %d\n", myInt);
nhưng trên 64 bit, nó sẽ phải được thay đổi để
print (" my int: %ld\n", (long)myInt);
Tôi có hai câu hỏi liên quan:
Suy nghĩ đầu tiên của tôi đó là khi bạn yêu cầu printf in một biến, cho nó một định dạng, nó sẽ xem xét địa chỉ của biến đó và lấy nhiều byte vì nó cần cho định dạng đó. Điều này dường như là một vấn đề lớn lúc đầu. Ví dụ nếu bạn có một biến myChar là một char (1 byte), nhưng sử dụng một định dạng specifier của% d, điều đó sẽ cho printf đi đến địa chỉ myChar và lấy 4 byte tiếp theo để xử lý nó như một int. Nếu đây là trường hợp, có vẻ như printf sẽ lấy ngày rác từ các biến lân cận (vì nó đã lấy 4 byte, nhưng giá trị thực chỉ là 1 byte). Điều này dường như không phải là trường hợp tuy nhiên. Bằng cách sử dụng myChar và chỉ định% d, printf lấy 1 byte và sau đó đệm 3 byte trên bằng 0. Sự hiểu biết của tôi có đúng ở đây không?
Nếu điều trên đúng, có bất kỳ tác hại thực sự nào trong việc luôn thúc đẩy các biến lên tới giá trị lớn nhất của chúng để tránh các loại sự cố được nhìn thấy trong trường hợp bit 32/64 hay không. Ví dụ: nếu bạn có biến myShort ngắn và biến int, myInt, có bất kỳ nhược điểm nào trong việc in chúng luôn như sau:
printf ("myShort% ld", (long) myShort); printf ("myInt% ld", (dài) myInt);
Cảm ơn bạn đã giải thích rõ.
bản sao có thể có của [Tự động loại khuyến mãi trong hàm variadic] (http://stackoverflow.com/questions/7084857/automatic-type-promotion-in-variadic-function) –
IMO, không thực sự gần với câu hỏi song công . Tôi sẽ khuyến khích mọi người tiếp tục thảo luận ở đây thay vì bỏ phiếu để đóng cửa. –
Tại sao bạn tin rằng 'printf ("% d ", myInt);' phải được thay đổi cho nền tảng 64 bit? –