2011-09-13 22 views
5

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)?

Trả lời

6

Không có gì trong C được thực hiện bên dưới int: ví dụ: khi thêm hai unsigned chars, ngay cả trước khi bổ sung, các toán hạng được chuyển đổi thành int theo các chương trình khuyến mãi mặc định.

unsigned char u1, u2, u3; 
u1 = 0; 
u2 = 42; 
u3 = u1 + u2; 

Trong dòng cuối cùng, u1 đầu tiên và u2 được chuyển đổi thành int, sau đó các nhà điều hành + được áp dụng để có được một giá trị int và sau đó giá trị được chuyển đổi trở lại unsigned char (tất nhiên trình biên dịch có thể sử dụng các phím tắt!)

+0

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

3

Điều này là do, trong C, loại kết quả của một thao tác trên hai unsigned char: s là int. Công cụ phân tích tĩnh chính xác (mặc dù không phải là rất trực quan) báo cáo rằng & được áp dụng cho một số int.

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