2010-01-04 28 views
28
 //key & hash are both byte[] 
     int leftPos = 0, rightPos = 31; 
     while(leftPos < 16) { 
      //possible loss of precision. required: byte, found: int 
      key[leftPos] = hash[leftPos]^hash[rightPos]; 
      leftPos++; 
      rightPos--; 
     } 

Tại sao thao tác bitwise trên hai byte trong Java trả về một int? Tôi biết tôi chỉ có thể bỏ nó trở lại byte, nhưng nó có vẻ ngớ ngẩn.Tại sao toán tử xor trên hai byte tạo ra một int?

+0

Để tham khảo: http: //java.sun .com/docs/sách/jls/third_edition/html/conversions.html # 5.6.2 và http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5233. Tôi không biết lý do, vì vậy tôi không đăng câu trả lời. –

+0

Đã chọn. Tôi không thể tìm thấy bất cứ điều gì mô tả * tại sao * ở trên xảy ra, chỉ là nó. –

+1

Loại quảng cáo tồn tại vì nhiều lý do. Đối với hoạt động bitwise nó sẽ làm cho ít ý nghĩa hơn so với gần như tất cả những người khác, nhưng sau đó - tại sao không? Bạn luôn có thể truyền lại. –

Trả lời

20

Vì thông số ngôn ngữ nói như vậy. Nó cung cấp cho không có lý do, nhưng tôi nghi ngờ rằng đây là những ý định có khả năng nhất:

  • Để có một bộ nhỏ và đơn giản các quy tắc để trang trải hoạt động số học liên quan đến tất cả các kết hợp có thể của các loại
  • Để cho phép một thực hiện hiệu quả - Các số nguyên 32 bit là những gì CPU sử dụng trong nội bộ và mọi thứ khác yêu cầu chuyển đổi, rõ ràng hoặc ẩn.
+3

Sử dụng các hoạt động CPU 32 bit gốc là nguyên nhân có khả năng nhất. – mletterle

2

Không có hoạt động bitwise Java nào trên hai byte. Mã của bạn ngầm và âm thầm chuyển đổi các byte đó thành một số nguyên lớn hơn (int), và kết quả cũng thuộc loại đó.

Bây giờ, bạn có thể đặt câu hỏi về sự tỉnh táo của các thao tác bitwise trên byte không xác định.

+0

Một lần nữa, câu hỏi là * tại sao * điều này xảy ra. –

+2

Đó là lý do tại sao nó xảy ra, câu hỏi tôi nghĩ rằng bạn đang tìm kiếm là "Tại sao họ quyết định để lại các toán tử bitwise trên kiểu byte không xác định đòi hỏi phải đưa vào int?" – mletterle

+3

Các thao tác * không * không xác định; trên thực tế chúng được định nghĩa khá rõ ràng. Nó chỉ là kết quả là một int và không thể được lưu trữ trong một byte [] mà không có đúc rõ ràng. –

4

Nếu đó là đúng và không có giá trị mà có thể gây ra sự mất mát này có độ chính xác nói cách khác: "không thể mất độ chính xác" trình biên dịch sẽ tắt ... và cần phải sửa chữa, và không có dàn diễn viên nào được thêm vào:

byte a = (byte) 0xDE; 
byte b = (byte) 0xAD; 
byte r = (byte) (a^b); 
Các vấn đề liên quan