2009-11-05 143 views

Trả lời

1

Bởi vì Java (và hầu hết các ngôn ngữ) đại diện cho các giá trị số nguyên âm sử dụng two's-complement math. Trong phần bù hai, 0xFF (11111111) đại diện cho (trong một int đã ký) giá trị -1.

17

Byte được đăng nhập bằng Java. Trong 0x00 nhị phân là 0, 0x01 là 1 và cứ thế nhưng tất cả 1s (tức là 0xFF) là -1, 0xFE là -2 và cứ tiếp tục như vậy. Xem Two's complement, là cơ chế mã hóa nhị phân được sử dụng.

+2

Và Java đang làm phần mở rộng dấu hiệu khi mở rộng byte thành một int. http://en.wikipedia.org/wiki/Two%27s_complement#Sign_extension – shf301

+0

thực sự là tiện ích mở rộng đăng ký là lý do chính đáng. –

13
  1. b được đề bạt lên một int trong việc xác định tình trạng quá tải của system.out.println để gọi.

  2. Tất cả các byte trong Java được ký.

  3. byte đã ký 0xff đại diện cho giá trị -1. Điều này là do Java sử dụng two's complement để biểu thị các giá trị đã ký. Byte đã ký 0xff đại diện cho -1 vì bit quan trọng nhất của nó là 1 (do đó nó đại diện cho giá trị âm) và giá trị của nó là -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1.

-1

Java không chỉ là phép toán bổ sung của 2. Đó là cách mọi bộ vi xử lý và DSP mà tôi có thể nghĩ về toán học. Vì vậy, nó là cách mọi ngôn ngữ lập trình đại diện cho nó.

+2

Nói đúng, một số ngôn ngữ (ví dụ: C và C++) không chỉ định đại diện nào được sử dụng cho số nguyên. Đó là nền tảng cụ thể. Mặt khác Java * * chỉ định biểu diễn bổ sung của 2. –

5

có lẽ sự nhầm lẫn của bạn xuất phát từ lý do tại sao (byte)0xFF bằng cách nào đó bằng (int)0xFFFFFFFF. Điều đang xảy ra ở đây là quảng cáo từ loại nhỏ hơn đến lớn hơn đã khiến giá trị nhỏ hơn là dấu mở rộng, theo đó bit quan trọng nhất được sao chép vào tất cả các bit mới của giá trị được quảng bá. một loại unsigned sẽ không trở thành dấu hiệu mở rộng, họ nhận được không mở rộng, các bit mới sẽ luôn luôn là số không.

Nếu nó giúp bạn nuốt nó, hãy suy nghĩ theo cách này, mọi số nguyên của bất kỳ kích thước nào cũng có một số bit 'phantom' quá quan trọng để biểu diễn. chúng ở đó, không được lưu trữ trong biến. một số âm có các bit không đồng phân, và các số dương có tất cả các số không cho các bit ảo khi bạn quảng bá một giá trị nhỏ hơn cho một giá trị lớn hơn, các bit ảo đó trở thành các bit thực.

-1

giảm modulo

byte = 256 0xff = 255

255/256 -> còn lại 255

Vì vậy, 255 - 256 = -1

Simple logic Cheers