JavaRush /Java Blog /Random-TW /鑄造原始類型。將 int 轉換為短整型和位元組
Георгий
等級 22
Санкт-Петербург

鑄造原始類型。將 int 轉換為短整型和位元組

在 Random-TW 群組發布
鑄造原始類型。 將 int 轉換為 Short 和 byte - 1為什麼如果將某些類型值強制轉換intshortor類型byte,結果會出乎意料?讓我們來看看吧!
int i = 450;
byte b = (byte)i;
System.out.println(b);
螢幕上的結果:

-62
沒想到,這有一個合乎邏輯的解釋;而且,這個動作可以用你自己的雙手完成。為此,我們需要將 450 從十進制轉換為二進位:

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
在數字的右欄中,我們寫下除以 2 後的餘數,在數字本身下方,如果餘數為 0,則寫下該數字除以 2 的結果。如果餘數為 1,則在下面寫下除以二的整數部分。(帶有計算解釋的線上計算器)。結果,我們在二進制數係統中得到 450 = 11100 0010。任何類型號都int佔用 4 個位元組或 32 位,其中每個位元都是 0 或 1。在我們的例子中,只佔用 9 位,原則上我們的二進位系統看起來像這樣int i = 450

0000_0000_0000_0000_0000_0001_1100_0010
我們想要將我們的變數寫入類型為 的變量byte,但類型號byte需要 1 個位元組(從該類型的名稱可知)或 8 位元。因此,左邊多餘的位就被簡單地丟棄,最後我們得到:

1100 0010
類型取值範圍byte:-128 到 127。每個數字佔 8 位,每個數字的最左位為符號位。對於所有正數它等於0,對於所有負數它等於1。不需要急於將我們上面得到的結果轉換成10次系統,因為 我們收到了所需號碼的附加代碼,而不是直接的代碼。最左邊的位結果等於 1,因此我們的數字是負數,並且對於負數,正數和反碼並不重合,這與正數不同。如果符號位等於0,那麼我們可以立即將數字轉換為十進制,得到:66。但是符號位是負數,所以首先我們需要將附加代碼轉換為直接的代碼並添加一個減號簽署答案。為了清楚起見和訓練,首先讓我們嘗試取得某個數字的附加程式碼,例如 -15。為此,需要在其正數表示的正碼(數字15)中,將所有0改為1,反之亦然(得到逆碼,也稱為逆),然後將結果加1。在十進制中 15 = 0000 1111; 反碼(將所有 0 改為 1,反之亦然)= 1111 0000; 附加程式碼(新增一個):

1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 1
1 1 1 1 0 0 0 1
數字 -15 的附加代碼:1111 0001; 太好了。現在,類比上面的例子,我們需要將附加程式碼轉換為直接程式碼;讓我提醒你,它等於1100 0010.
  1. 減一即可得到相反的代碼。這樣做很方便,在答案中寫下一個附加程式碼,然後看看需要添加一個才能獲得這樣的附加程式碼。我們從最右邊的數字開始,看看:我們需要在什麼上加 1 才能得到 0?對於 1,我們得到 10,0 進行回應,1 進入下一個數字。接下來,需要加上 0 才能得到 1。1,但由於我們前面的數字是 1,所以我們在回應中寫 0。接下來,要得到 0,我們應該在 0 上加上什麼?當然是0。所以還有4次。還剩下最後2位,需要在0上加一些東西才能得到1。當然,這兩種情況都需要加1。總計:

    
    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. 最難的部分已經過去了!我們已經收到了反碼,我們所要做的就是獲取正碼。我們將所有 0 反轉為 1,反之亦然:

    1100 0001- 反碼;

    0011 1110 - 我們號碼的直接代碼,或更確切地說是其正面表示;

  3. 轉換為十進制(帶有計算說明的線上計算器):

    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;

    剩下的就是在數字和我們的答案中加上一個減號:-62.

以同樣的方式,將 type 的數字轉換short為 type int
int i = 10_000_000;
short s = (short)i;
System.out.println(s); // -27008
  1. 第 10 進位中的 10,000,000 =0000 0000 1001 1000 1001 0110 1000 0000第 2 進位中的 10,000,000。

    在 Java 中,一個類型號int佔用 4 個字節,一個類型short號佔用 2 個字節,即 16 位,因此我們將左邊截去 16 位:

  2. 1001 0110 1000 0000。最左邊的位(最高有效位,也稱為符號位)結果等於 1。這意味著我們有一個負數的附加代碼,因此我們繼續進行下一點。
  3. 我們把它翻譯成逆向程式碼:

    
    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

    返回碼:1001 0110 0111 1111;

  4. 我們反轉並得到直接代碼:0110 1001 1000 0000

  5. 我們轉換為二進制數係統並得到我們的數字的正表示:

    1∙2^14+1∙2^13+1∙2^11+1∙2^8+1∙2^7 = 16384+8192+2048+256+128 = 27008.
  6. 加一個減號即可得到答案:-27008

鑄造原始類型。 將 int 轉換為 Short 和 byte - 2連結到正向、反向和互補程式碼的線上計算器。另外,在這個網站的計算器下,有一些關於逆碼和補碼的理論。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION