2011-08-05 34 views
5

Tôi đã làm việc cùng một quy trình trong JavaScript và C# với toán tử &, nhưng kết quả lại khác.Tại sao trả về giá trị khác nhau khi sử dụng & toán tử trong JavaScript và C#?

C# Mã

Int64 x = (634586400000000000 & 4611686018427387903); 
x= 634586400000000000; 

Mã Javascript

var x = (634586400000000000 & 4611686018427387903); 
x= 0; 

Bất kỳ ý tưởng?

+0

... vì JavaScript và C# là các ngôn ngữ khác nhau? – BoltClock

Trả lời

2

Có vẻ như tôi đang vượt quá giá trị số nguyên tối đa của JavaScript. Giá trị được hỗ trợ tối đa cho các số nguyên JavaScript là spec'd tại 2^53.

UPDATE:

phản ứng ban đầu của tôi ở đây là không đúng - vấn đề không phải là giá trị số nguyên tối đa Javascript, nó là giá trị tối đa của mỗi toán hạng xử lý bởi các op dấu và:

var biggest = 4294967291; // maximum 32 bit unsigned integer 
alert(biggest & 1); // alerts 1 
alert((biggest + 1) & 1); // alerts 0 

Chúc mừng mã hóa !

B

5

Bitwise operators trong javascript chuyển đổi các toán hạng để số nguyên 32-bit đã ký (từ có nguồn gốc IEEE 754 nổi con số này được lưu trữ trong).

+0

Một thư viện như [bigInt.js] (http://www.leemon.com/crypto/BigInt.html) có thể trợ giúp ở đây, mặc dù tôi chưa đích thân thử nó. – darioo

+1

Điều đó có nghĩa là bạn không thể thực hiện bất kỳ hoạt động sinh trắc nào trên các số lớn hơn (khoảng) 2 tỷ hoặc thấp hơn (xấp xỉ) -2 tỷ. Nếu bạn làm như vậy, hành vi không được xác định. –

+0

Hành vi thực tế được xác định rõ. Từ "Javascript: The Defenitive Guide", trang 73: "Nếu toán tử bitwise được sử dụng với toán hạng không phải là số nguyên hoặc quá lớn để vừa với biểu diễn số nguyên 32 bit, chúng đơn giản ép buộc toán hạng thành số nguyên 32 bit bằng cách thả của bất kỳ phần phân đoạn nào của toán hạng hoặc bất kỳ bit nào ngoài số 32. " –

0

Các toán tử bitwise xử lý tối đa 32 bit. Tôi không biết làm thế nào được xác định hành vi là khi yêu cầu nó để đối phó với các giá trị lớn hơn.

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