JavaRush /Blog Java /Random-VI /Đúc các loại nguyên thủy. Truyền thành ngắn và byte
Георгий
Mức độ
Санкт-Петербург

Đúc các loại nguyên thủy. Truyền thành ngắn và byte

Xuất bản trong nhóm
Đúc các loại nguyên thủy.  Truyền thành short và byte - 1Tại sao nếu bạn ép kiểu một số giá trị kiểu intsang kiểu shortor bytethì kết quả lại không như mong đợi? Hãy cùng tìm hiểu!
int i = 450;
byte b = (byte)i;
System.out.println(b);
Kết quả trên màn hình:

-62
Thật bất ngờ, có một lời giải thích hợp lý cho việc này, hơn nữa, hành động này có thể được thực hiện bằng chính đôi tay của bạn. Để làm điều này, chúng ta cần chuyển đổi 450 từ thập phân sang nhị phân:

450/2.    0
225/2.    1
112/2.    0
56/2.     0
28/2.     0
14/2.     0
7/2.      1
3/2.      1
1/2.      1
Cột bên phải của số ta viết số dư khi chia cho 2, dưới chính số đó ta viết kết quả của phép chia số đó cho 2 nếu số dư bằng 0. Nếu số dư bằng 1 thì bên dưới ta viết phần nguyên của phép chia cho hai. ( Máy tính trực tuyến có giải thích cách tính ). Kết quả là chúng ta có được điều đó trong hệ thống số nhị phân 450 = 11100 0010. Bất kỳ số loại nào intcũng chiếm 4 byte hoặc 32 bit, trong đó mỗi bit là 0 hoặc 1. Trong trường hợp của chúng tôi, chỉ có 9 bit bị chiếm và về nguyên tắc, số của chúng tôi trong int i = 450hệ nhị phân trông như thế này:

0000_0000_0000_0000_0000_0001_1100_0010
Chúng tôi muốn viết biến của mình thành một biến loại byte, nhưng số loại bytemất 1 byte (như sau tên của loại này) hoặc 8 bit. Do đó, các bit bổ sung ở bên trái sẽ bị loại bỏ và cuối cùng chúng ta nhận được:

1100 0010
Phạm vi giá trị loại byte: -128 đến 127. Mỗi số chiếm 8 bit và bit ngoài cùng bên trái của mỗi số là bit dấu. Đối với tất cả các số dương, nó bằng 0, đối với tất cả các số âm, nó bằng 1. Không cần phải vội chuyển kết quả của chúng ta thu được ở trên sang hệ thứ 10, bởi vì chúng tôi đã nhận được một mã bổ sung cho số mong muốn chứ không phải mã trực tiếp. Bit ngoài cùng bên trái hóa ra bằng 1, do đó số của chúng tôi là số âm và đối với số âm, mã trực tiếp và mã ngược không trùng nhau, không giống như mã dương. Nếu bit dấu bằng 0 thì chúng ta có thể chuyển ngay số đó sang hệ thập phân và nhận được: 66. Nhưng bit dấu là âm, vì vậy trước tiên chúng ta cần chuyển mã bổ sung thành mã trực tiếp và thêm dấu trừ ký vào câu trả lời. Để rõ ràng và dễ hiểu, trước tiên chúng ta hãy thử lấy mã bổ sung của một số nào đó, ví dụ -15. Để làm điều này, trong mã trực tiếp biểu diễn dương của nó (số 15), bạn cần thay đổi tất cả 0 thành 1 và ngược lại (lấy mã ngược, còn gọi là nghịch đảo), sau đó thêm một vào kết quả. Trong hệ thập phân 15 = 0000 1111; Đảo ngược mã (đổi toàn bộ số 0 thành 1 và ngược lại) = 1111 0000; Mã bổ sung (thêm một):

1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 1
1 1 1 1 0 0 0 1
Mã bổ sung cho số -15: 1111 0001; Tuyệt vời. Bây giờ, bằng cách tương tự với ví dụ trên, chúng ta cần chuyển đổi mã bổ sung thành mã trực tiếp; để tôi nhắc bạn, nó bằng 1100 0010.
  1. Trừ một và lấy mã ngược lại. Thật thuận tiện để làm điều này, hãy viết ra một mã bổ sung trong câu trả lời và xem bạn cần thêm mã nào vào để có được mã bổ sung như vậy. Chúng ta bắt đầu với chữ số ngoài cùng bên phải và xem: chúng ta cần thêm 1 vào số nào để có 0? Đến 1, chúng ta nhận được 10, 0 tương ứng và 1 chuyển sang chữ số tiếp theo. Tiếp theo, những gì cần được thêm vào 0 để có được một. Một, nhưng vì chúng ta có số một từ chữ số trước đó nên chúng ta viết 0. Tiếp theo, để có 0, chúng ta nên thêm gì vào 0? Tất nhiên là 0. Vậy là 4 lần nữa. Và còn lại 2 chữ số cuối, bạn cần thêm một số vào 0 để được 1. Tất nhiên, trong cả hai trường hợp, bạn cần thêm 1. Tổng cộng:

    
    1 1 0 0 0 0 0 1
    0 0 0 0 0 0 0 1
    1 1 0 0 0 0 1 0
  2. Phần khó nhất đã qua! Chúng tôi đã nhận được mã nghịch đảo (đảo ngược) và tất cả những gì chúng tôi phải làm là lấy mã trực tiếp. Chúng ta đảo ngược tất cả 0 thành 1 và ngược lại:

    1100 0001- mã nghịch đảo;

    0011 1110 - mã trực tiếp của số của chúng tôi, hay đúng hơn là đại diện tích cực của nó;

  3. Chuyển đổi sang hệ thập phân ( Máy tính trực tuyến có giải thích phép tính ):

    0011 1110 = 0∙2^7+0∙2^6+1∙2^5+1∙2^4+1∙2^3+1∙2^2+1∙2^1+0∙2^0 = 0+0+32+16+8+4+2+0 = 62;

    Tất cả những gì còn lại là thêm dấu trừ vào số và câu trả lời của chúng tôi:-62.

Theo cách tương tự, số loại được chuyển đổi shortthành type int:
int i = 10_000_000;
short s = (short)i;
System.out.println(s); // -27008
  1. 10.000.000 trong hệ thống số thứ 10 = 0000 0000 1001 1000 1001 0110 1000 0000trong hệ thống số thứ 2.

    Trong Java, số loại intmất 4 byte và số loại shortmất 2 byte hoặc 16 bit, vì vậy chúng tôi cắt bên trái xuống còn 16 chữ số:

  2. 1001 0110 1000 0000. Bit ngoài cùng bên trái (bit quan trọng nhất, còn được gọi là bit dấu) hóa ra bằng 1. Điều này có nghĩa là chúng ta có thêm mã cho số âm, vì vậy chúng ta chuyển sang điểm tiếp theo.
  3. Hãy dịch nó sang mã ngược lại:

    
    1 0 0 1 0 1 1 0 0 1 1 1 1 1 1 1
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
    1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0

    Mã trả về: 1001 0110 0111 1111;

  4. Chúng tôi đảo ngược và nhận được mã trực tiếp: 0110 1001 1000 0000.

  5. Chúng tôi chuyển đổi sang hệ thống số nhị phân và nhận được biểu diễn tích cực cho số của chúng tôi:

    1∙2^14+1∙2^13+1∙2^11+1∙2^8+1∙2^7 = 16384+8192+2048+256+128 = 27008.
  6. Thêm một điểm trừ và nhận được câu trả lời:-27008

Đúc các loại nguyên thủy.  Truyền thành short và byte - 2Liên kết với một máy tính trực tuyến về mã tiến, mã lùi và mã bổ sung. Ngoài ra, trên trang web này, bên dưới máy tính, còn có một số lý thuyết nhỏ về mã nghịch đảo và mã bù.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION