JavaRush /Java Blog /Random-TW /在 Java 中轉換(轉換)基本型別

在 Java 中轉換(轉換)基本型別

在 Random-TW 群組發布
你好!在學習 JavaRush 時,您不只一次遇到原始類型。以下是我們對它們的了解的簡短清單:
  1. 它們不是對象,代表儲存在記憶體中的值
  2. 原始類型有以下幾種類型:
    • 整數 - byteshortintlong
    • 浮點數(小數) -floatdouble
    • 布林值 -boolean
    • 符號(表示字母和數字)-char
  3. 它們每個都有自己的值範圍:
原始型 記憶體大小 數值範圍
位元組 8位 -128 至 127
短的 16位 至 -32768 至 32767
字元 16位 從 0 到 65536
整數 32位 從-2147483648 到 2147483647
長的 64位 從-9223372036854775808到9223372036854775807
漂浮 32位 從 (2 的 -149 次方) 到 ((2-2 的 -23 次方)*2 的 127 次方)
雙倍的 64位 由 (-2 的 63 次方) 到 ((2 的 63 次方) - 1)
布林值 8(用於數組時)、32(用於非數組時) 對或錯
但是,除了值之外,類型的記憶體大小也有所不同。 int需要超過byte. A-long超過short。基元佔用的記憶體量可以與嵌套娃娃進行比較: 原始類型的擴展和收縮 - 2 嵌套娃娃內部有可用空間。嵌套娃娃越大,空間越大。long我們可以輕鬆地將較小的娃娃放入大型嵌套娃娃中int。它很容易安裝,您不需要做任何額外的事情。在 Java 中,當使用原語時,這稱為自動轉換。換句話說,它被稱為擴展。這是一個簡單的擴充範例:
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       byte littleNumber = 16;

       bigNumber = littleNumber;
       System.out.println(bigNumber);
   }
}
byte這裡我們給一個變數 賦值int。分配成功且沒有任何問題:儲存在 中的值byte所佔用的記憶體空間比它「適合」在 中的記憶體空間少int。「小嵌套娃娃」(值byte)很容易融入「大娃娃」(變數int)。當你嘗試做相反的事情時,那就是另一回事了——將一個大值放入一個不是為這種大小設計的變數中。原則上,這個技巧不適用於真正的嵌套娃娃,但在 Java 中它會起作用,但有細微差別。讓我們嘗試將一個值放入int變數中short
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = bigNumber;//error!
   System.out.println(bigNumber);
}
錯誤!編譯器知道您正在嘗試做一些非標準的事情,並將一個大的俄羅斯娃娃 ( int) 放在一個小的 ( short) 中。在這種情況下,編譯錯誤是來自編譯器的警告:「嘿,你確定要這樣做嗎?“如果你確定,請告訴編譯器:“一切都好,我知道我在做什麼!” ” 這個過程稱為顯式類型轉換,或縮小。若要縮小範圍,您需要明確指示要將值轉換為的類型。換句話說,回答編譯器的問題:“那麼,你想把這個大娃娃放入這些小娃娃中的哪一個?” 」 在我們的例子中,它看起來像這樣:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = (short) bigNumber;
   System.out.println(littleNumber);
}
我們明確表示我們希望將值int放入變數中short並對其負責。編譯器看到較窄類型的明確指示後會執行轉換。結果會怎樣呢? 控制台輸出: -27008 有點出乎意料。為什麼會這樣呢?其實很簡單。我們有原始值 - 10000000 它儲存在一個int佔用 32 位元的變數中,以二進位形式它看起來像這樣: 原始類型的擴展和收縮 - 3 我們將這個值寫入變量short,但它只能儲存 16 位元!因此,只有我們的數字的前 16 位將被移動到那裡,其餘的將被丟棄。結果,該變數short將包含值 原始類型的擴展和收縮 - 4,其十進位形式恰好等於 -27008 這就是編譯器以明確轉換為特定類型的形式「要求確認」的原因。首先,它表明您對結果負責,其次,它告訴編譯器在轉換類型時要分配多少空間。畢竟,如果在最後一個範例中我們將int類型轉換為byte,而不是short,那麼我們將只有 8 位可供使用,而不是 16 位,結果也會有所不同。對於小數類型 (floatdouble),縮小的情況有所不同。如果您嘗試將此類數字轉換為整數類型,則其小數部分將被丟棄。
public static void main(String[] args) {

   double d = 2.7;

   long x = (int) d;
   System.out.println(x);
}
控制台輸出: 2

資料類型 字元

您已經知道 char 類型用於顯示單一字元。
public static void main(String[] args) {

   char c = '!';
   char z = 'z';
   char i = '8';

}
但它有許多需要理解的重要功能。讓我們再看一下帶有值範圍的表:
原始型 記憶體大小 數值範圍
位元組 8位 -128 至 127
短的 16位 -32768至32767
字元 16位 從 0 到 65536
整數 32位 從-2147483648 到 2147483647
長的 64位 從-9223372036854775808到9223372036854775807
漂浮 32位 從 (2 的 -149 次方) 到 ((2-2 的 -23 次方)*2 的 127 次方)
雙倍的 64位 由 (-2 的 63 次方) 到 ((2 的 63 次方)-1)
布林值 8(用於數組時)、32(用於非數組時) 對或錯
該類型char的數值範圍是 0 到 65536。但這是什麼意思呢?畢竟,char這些不僅僅是數字,還有字母、標點符號……事實是,值char在 Java 中是以 Unicode 格式儲存的。我們在之前的一堂課中已經接觸過 Unicode。您可能還記得Unicode是一種字元編碼標準,其中包括世界上幾乎所有書面語言的字元。換句話說,這是一個特殊代碼列表,其中幾乎包含任何語言的任何字元的代碼。一般的Unicode表很大,當然不需要死記硬背。例如,這裡是其中的一部分: 原始類型的擴展和收縮 - 5 主要是了解儲存值的原理char,並記住,知道特定符號的程式碼,您始終可以在程式中取得它。讓我們用一些隨機數字來嘗試:
public static void main(String[] args) {

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
控制台輸出:耰 這是Java中字元儲存的格式char。每個字元對應一個數字 - 16 位元或兩個位元組的數字代碼。Unicode 32816 對應於字元耰。注意這一刻。在這個例子中我們使用了變數int. 佔用32位元內存,而char16位元。這裡我們選擇是因為我們需要的數字 32816 超出了範圍。儘管大小與 Short 一樣是 16 位,但範圍內沒有負數,因此「正」範圍是兩倍大(65536 而不是 32767 )。我們可以使用,只要我們的程式碼在65536的範圍內。但是如果我們建立一個數字,它將佔用超過16位。縮小類型範圍時: intshortcharcharcharshortintint >65536
char c = (char) x;
多餘的位將被丟棄,結果將是非常出乎意料的。

字元和整數相加的特點

讓我們來看看這個不尋常的例子:
public class Main {

   public static void main(String[] args) {

      char c = '1';

      int i = 1;

       System.out.println(i+c);
   }
}
控制台輸出: 50 O_O 邏輯在哪裡?1+1,50哪裡來的?!您已經知道,值char在內存中以 0 到 65536 範圍內的數字存儲,代表我們字元的 Unicode。 原始類型的擴展和收縮 - 6 所以就是這樣。當我們執行加法時char,某些整數類型char會轉換為 Unicode 中與其對應的數字。當我們在程式碼中加入 1 和 '1' 時,符號 '1' 會轉換為其程式碼,即 49(您可以在上表中查看)。因此,結果等於50。讓我們再次以我們的老朋友-為例,試著將它與某個數字相加。
public static void main(String[] args) {

   char c = '耰';
   int x = 200;

   System.out.println(c + x);
}
控制台輸出: 33016 我們已經發現對應於代碼32816。當我們將這個數字與200相加時,我們得到的正是我們的結果 - 33016 :) 正如你所看到的,操作機制非常簡單。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION