2012-02-17 27 views
6

Trong JavaScript, có vẻ như:Tại sao JavaScript bitwise HOẶC hành xử kỳ lạ?

(4294958077 | 0) == -9219 

Tại sao nó không 4294958077?

Nó gợi ý rằng có một số loại tràn đá trong (mặc dù như tôi hiểu nó phạm vi một loại của Số JavaScript là +/- 9007199254740992 vì vậy đó là lẻ của riêng mình.)

Thậm chí nếu đó là một tràn, chắc chắn

(4294958077 | 0) == 4294958077 

nên đánh giá là đúng - nhưng không.

Trợ giúp xin vui lòng

+0

Kiểm tra điều này: 'alert ((4294958077 | 0));' – Smamatti

Trả lời

5

Không có gì liên quan đến loại điểm nổi hoặc tràn. Nó trả về -9219 vì tiêu chuẩn bắt buộc nó, vì tất cả các hoạt động bitwise nhị phân phải được thực hiện bằng cách sử dụng đã ký số nguyên 32 bit (ECMA-262 § 11.10).

Việc sản xuất Một: Một @B, nơi @ là một trong những nhà khai thác Bitwise trong tác phẩm trên, được đánh giá như sau:

  1. Hãy lref là kết quả của việc đánh giá A.
  2. Hãy để lval là GetValue (lref).
  3. Hãy để rref là kết quả của việc đánh giá B.
  4. Hãy để rval là GetValue (rref).
  5. Hãy để lnum là ToInt32 (lval).
  6. Hãy để rnum là ToInt32 (rval).
  7. Trả về kết quả của việc áp dụng toán tử bitwise @ đến lnumrnum. Kết quả là một số nguyên 32 bit đã ký.

4294958077 chuyển đổi sang một ký 32-bit số nguyên (sử dụng các thuật toán trong ECMA-262 § 9.5) là -9219, và 0 vẫn là 0, do đó Bitwise-hoặc sẽ trở -9219.

+0

+1 như được hiển thị bởi (4294958077 | 0) >>> 0 === 4294958077 not -9219 –

2

Tất cả các số trong Javascript là 64 bit số dấu phẩy động. Bitwise hoạt động trên phao là một trường hợp cạnh, do đó, nội bộ những phao được tạm thời chuyển đổi sang một int 32bit, sau đó hoạt động bitwise được thực hiện - do đó tràn của bạn.

0

Số bit bit JavaScript được lưu trữ dưới dạng bit nổi 64 bit, nghĩa là bạn chỉ có 32 bit để sử dụng cho số nguyên, mà bạn đã vượt quá, do đó, nó biến mất bằng cách chuyển đổi thành số nguyên nhất có thể và sau đó thực hiện thao tác.

Thông tin khác here (đặc biệt là phần 'ngoài 32 bit') nhưng không có giải pháp thực, rất tiếc, bạn sẽ cần phải giải quyết nó.

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