2017-11-01 13 views
7

Tôi đang thực hiện thao tác dịch chuyển trái bit trên số âm.Tại sao thay đổi giá trị âm bằng chữ là đưa ra cảnh báo [-Wshift-negative-value]

int main(void) { 
    int count = 2; 
    printf("%d\n", ~0<<count); 
    printf("%d\n", ~0<<2); // warning:shifting a negative signed value is undefined [-Wshift-negative-value] 
    return 0; 
} 

Nghi ngờ của tôi là lý do cảnh báo xuất hiện khi dịch chuyển chứ không phải khi biến được sử dụng.

+2

Tôi nghĩ anh ấy hỏi tại sao '~ 0 << 2' dẫn đến cảnh báo, nhưng' ~ 0 << count' thì không. –

+1

@ChristianGibbons Yeah, hiểu rồi. Một chút quá muộn –

+2

Có lẽ vì 'số' có thể là' 0' –

Trả lời

2

Theo C89, việc triển khai bổ sung và cường độ đăng nhập được yêu cầu để xử lý các thay đổi trái của các giá trị âm theo các cách có thể không hợp lý nhất trên các nền tảng đó. Ví dụ: trên nền tảng bổ sung của một người, C89 đã xác định -1 < < 1 dưới dạng -3. Các tác giả của tiêu chuẩn đã quyết định sửa vấn đề này bằng cách cho phép các trình biên dịch biên dịch xử lý các thay đổi trái của các số âm theo bất kỳ cách nào mà chúng thấy phù hợp. Thực tế là họ cho phép sự linh hoạt đó cho tất cả các triển khai bao gồm cả hai bổ sung không nên được thực hiện để ngụ ý rằng chúng dự định thực hiện hai bổ sung để đi chệch khỏi hành vi C89. Nhiều khả năng hơn, họ dự định và mong đợi rằng hành vi hợp lý trên hai nền tảng bổ sung sẽ đủ rõ ràng rằng các nhà văn biên dịch sẽ tìm ra nó có hoặc không có ủy nhiệm.

Trình biên dịch thường Squawk về trái chuyển hằng tiêu cực bởi các hằng số khác vì x<<y có thể được đơn giản hóa khi cả hai xy là hằng số, nhưng đơn giản hóa như vậy sẽ đòi hỏi thực hiện các thay đổi tại thời gian biên dịch hay không các mã có chứa các thay đổi là được thực hiện. Ngược lại, được đưa ra someConstant << nonConstant, không đơn giản hóa thường sẽ là có thể và do đó trình biên dịch sẽ chỉ đơn giản là tạo mã mà không thay đổi tại thời gian chạy.

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