Tôi đã ăn đoạn mã sau thông qua một công cụ phân tích tĩnh:Dấu ngoặc đơn trong C có thể thay đổi loại kết quả của toán hạng hoạt động bitwise không?
u1 = (u1^u2); // OK
u1 = (u1^u2) & u3; // NOT OK
u1 = (u1^u2) & 10; // NOT OK
u1 = (u1^u2) & 10U; // NOT OK
u1 = (unsigned char)(u1^u2) & 10U; // OK
u1 = (unsigned char)(u1^u2) & u3; // OK
"OK" có nghĩa là các công cụ phân tích tĩnh không phàn nàn. "NOT OK" có nghĩa là công cụ phân tích tĩnh đã khiếu nại - tuyên bố rằng một số toán hạng của một hoạt động bitwise không phải là một số nguyên không dấu.
Kết quả từ 2 dòng cuối cùng cho thấy các dấu ngoặc đơn đang gây ra
a. chuyển đổi loại thực tế thành chữ ký
b. một cái gì đó mà công cụ phân tích tĩnh nghĩ là chuyển đổi loại thành chữ ký
Tôi sẽ hỏi nhà phát triển công cụ phân tích tĩnh về (b).
Nhưng trước khi tôi làm, tôi muốn biết nếu có lẽ ngôn ngữ C được biết là làm (a)?
Cảm ơn @pmg! Tôi sẽ để lại từ "dấu ngoặc đơn" trong tiêu đề câu hỏi bởi vì, mặc dù bây giờ tôi biết rằng chúng không liên quan, những người khác cũng có thể nghĩ chúng là nguyên nhân gây ra vấn đề, tìm kiếm và tìm câu trả lời này. Bây giờ tôi hiểu rằng câu trả lời hay này là một trường hợp đặc biệt của "học các quy tắc khuyến mãi số nguyên C". Rất nhiều tài liệu tham khảo ngoài đó (bây giờ tôi biết những gì cần tìm). Ví dụ. http://tinyurl.com/62fm8yl trên stackoverflow, và href = "http://www.lysator.liu.se/c/rat/c2.html#3-2" - một cuộc thảo luận về "bảo tồn và giá trị không dấu bảo quản ". – talkaboutquality