2012-06-30 24 views
7

Xét đoạn mã sau:Tiêu chuẩn C nói gì về bithifting bit nhiều hơn chiều rộng của loại?

int i = 3 << 65; 

Tôi hy vọng rằng kết quả là i==0, tuy nhiên kết quả thực tế là i==6. Với một số thử nghiệm tôi thấy rằng với đoạn mã sau:

int i, s; 
int a = i << s; 
int b = i << (s & 31); 

các giá trị của ab luôn luôn giống nhau.

Chuẩn C có nói gì về việc chuyển đổi hơn 32 bit (chiều rộng loại int) hoặc hành vi không xác định này không?

Trả lời

12

Từ dự thảo WG12/N1124 của tôi (không tiêu chuẩn, nhưng Good Enough For Me), có khối sau trong 6.5.7 Bitwise nhà khai thác dịch chuyển:

Nếu giá trị quyền toán hạng là âm hoặc là lớn hơn hoặc bằng chiều rộng của toán hạng trái được thăng hạng, hành vi không xác định.

Vì vậy, chưa xác định. Hãy cẩn thận.

+0

"Đủ tốt cho tôi" - đủ tốt cho mọi người, vì tiêu chuẩn chứa chính xác cùng một ngôn ngữ. :-) Lưu ý rằng bạn cũng có thể có được C99 + TC3 miễn phí tại http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf và nó cũng có cùng ngôn ngữ, vì vậy ngay cả khi bạn không có tiêu chuẩn chính nó, bạn có thể khá chắc chắn những gì nó nói! –

+3

Bạn cũng có thể có được phiên bản html dễ đọc hơn nhiều ở đây: http://port70.net/~nsz/c/c99/n1256.html –

+0

@R .., oh, cảm ơn, điều đó sẽ dễ dàng hơn để đọc hơn PDF. :) – sarnold

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