2015-07-21 25 views
11

Kết quả của số khi nó bị dịch chuyển bởi -1 trong lập trình C bằng cách sử dụng toán tử thay đổi bên trái là gì?Giá trị số lượng dịch chuyển trái bằng -1

ví dụ:

23 << -1 
+2

dịch chuyển trái với -1 trông giống như dịch chuyển đúng với 1 – adricadar

+0

@adricadar: Có vẻ như (và đôi khi tôi không thích nó), nhưng: Về cơ bản là sai. – Olaf

+0

Lưu ý: Vì OP cho biết "số", có một hạn chế khác: "Mỗi toán hạng phải có loại số nguyên". – chux

Trả lời

9

Từ C11 chuẩn 6.5.7p3 (đối với các phiên bản cũ của nó về cơ bản là giống nhau):

"Nếu giá trị của toán hạng bên phải là tiêu cực hoặc là lớn hơn hoặc bằng với chiều rộng của toán hạng trái được khuyến khích, hành vi là không xác định. "

IOW: undefined behaviour. Chuẩn bị cho nasal demons.

ngắn gọn: Đừng

Chú ý: Trong khi nhiều lập trình viên nhận thức được điều đó và tránh đếm sự thay đổi tiêu cực, nó thường bị bỏ qua mà cũng đếm >= bit-kích thước của giá trị cũng là không xác định. Điều này làm cho một cái gì đó như ((unsigned int)1 << 32) - 1 thực sự không xác định nếu unsigned int có 32 bit hoặc ít hơn. Đối với các giá trị đã ký, mọi thứ trở thành more complicated do dấu (cảm ơn @chux vì đã chỉ cho tôi điều đó). Đây là một cạm bẫy phổ biến. Đối với một số triển khai, kết quả khác nhau cho biểu thức không đổi (đánh giá thời gian biên dịch) và đánh giá thời gian chạy có thể xảy ra.

+1

Không phải là '((int) 1 << 31) - 1' cũng không xác định nếu' int' có 32 bit hoặc ít hơn không? – chux

+0

@chux: Đã cập nhật. Cảm ơn bạn – Olaf

0

Bitwise Left phím Shift điều hành trong C:

  1. Bit mẫu của dữ liệu có thể được chuyển bằng số quy định của vị trí để trái
  2. Khi dữ liệu được chuyển Left, trailing zero của được làm đầy với zero.
  3. Toán tử bên trái Toán tử nhị phân [Bi - hai]
  4. Phương tiện nhị phân, Toán tử yêu cầu hai đối số!

Table

Cú pháp:

**[variable]<<[number of places]** 

Nếu Số Places trở thành tiêu cực, nó sẽ được undefined

1

Như Olaf nói trong câu trả lời của mình, trái chuyển bởi một số âm không định nghĩa được.

Thực tế, gcc sẽ đưa ra cảnh báo nếu bạn thử thay đổi theo hai hướng theo số âm.

+3

"... gcc sẽ đưa ra cảnh báo ...": nhưng chỉ khi nó có thể phát hiện thời gian biên dịch, nghĩa là nếu số lần dịch là hằng số như trong câu hỏi. – Olaf

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