---
# System prepended metadata

title: Algorithm 4/e (1)

---

[PREVIOUS](https://hackmd.io/PHk0DJqvSO-ohdsazSRiCg)
# 原始數據類型(Primitive)


| 表達| 定義說明| 舉例 |
| -------- | -------- | -------- |
|   Primitive   | 一组数据和对其所能进行的操作的集合（Java 语言内置)     | int, double, boolean, char     |
|變數(Variable)|表示某數據類型的值| 任意{標示符} |
|標示符 | 由字母、数字、下划线和 $组成的字符串，首字符不能是數字，且不能剛好是Java的保留字。編碼規則請參照編碼慣例 (Java Coding Conventions)。 |a, b, jasonOne, test |
|運算符號（算術比較)| 表示某數據類型的運算符號。|  + － * / |
|邏輯比較| 邏輯運算子用於對布林值 (boolean) 進行操作，並產生一個新的布林值。| && (AND)<br>\|\| (OR)<br>! (NOT)
|位元運算|位元運算子用於對整數類型的二進位表示進行操作。| & (AND)<br> \| (OR)<br> ^ (XOR)<br> ~ (NOT)<br> << (左移)<br> >> (右移)<br> >>> (無號右移)


## 運算子重載 (Operator Overloading)
運算子　 +、-、*、/ 都是被「重載過」的，某種程度上是正確的，但需要根據 Java 的上下文來理解，＂＋＂這是 Java 中唯一一個真正意義上被重載的運算子，因為它不僅可以用於數值加法，還可以用於字串連接 (String Concatenation)。號：這些運算子在 Java 中並沒有被重載。它們的作用是固定的，只用於數值運算，不會根據上下文對不同類型執行完全不同的操作（例如字串）。

| 數據類型 | 佔用位元 | 範圍 | 運算類型 | 備註 |
| :--- | :--- | :--- | :--- | :--- |
| **int** | 32 位元 | $[-2^{31}, 2^{31}-1]$ | 算術、位元、比較 | 最常用的整數類型。 |
| **char** | 16 位元 | `\u0000` 到 `\uffff` (0-65535) | 算術、比較 | 用於表示單一的 Unicode 字元。本質上是無符號整數，可進行數值運算。 |
| **double** | 64 位元 | 約 $4.94 \times 10^{-324}$ 到 $1.8 \times 10^{308}$ | 算術、比較 | 雙精度浮點數，Java 預設的浮點數類型。 |
| **boolean** | 8 位元 | 只有 `true` 和 `false` | 邏輯、比較 | 用於邏輯判斷，不能進行算術運算。 |

## 轉型
* 自動型別升級 (Automatic Type Promotion)
    當你在一個運算式中，使用了不同數值型別的資料時，Java 為了避免資料流失（也就是避免算出來的結果不準），會自動將精確度比較低的型別，提升成精確度比較高的型別。

    ```java
    /*
     * 型別自動提升的例子
     */
    dobule a = 1+ 2.5;//1 是一個 int 整數型別。2.5 是一個 double 浮點數型別。
    ```

    因為 double 比 int 更精準，Java 會很貼心地把 1 升級成 double 型別的 1.0，然後再進行運算。所以，這個運算式最後的結果會是 double 型別的 3.5。這種轉換是「隱性」的，編譯器會自動幫你做，不需要你寫任何額外的程式碼。

* 強制型別轉換 (Explicit Type Casting)
    當你想要把一個「精確度比較高」的型別，轉換成「精確度比較低」的型別時，你就需要「顯性」地告訴編譯器：「我已經知道可能會遺失資料，但我還是要這樣做」。這就是透過在資料前面加上(目標型別)來達成。
    ```java

    /*
     *    (int)3.7：把 double 型別的 3.7 強制轉換成 int 整數。
     *    這個過程是「直接捨去」小數點後面的部分，所以結果會變成 3，而不是 4。 
     * 
     *    (double)3：把 int 型別的 3 轉換成 double 型別。
     *    雖然這個轉換也可以自動發生，但你也可以自己寫出來，讓程式碼看起來更清楚。
     * 
     *    var 關鍵字會根據賦值（6.0）的型別來自動推斷變數 test 的型別。
     *    因為 6.0 是 double 型別，所以 test 也會被宣告成 double 型別。
     * 
     *    var 關鍵字是從 Java 10 開始引入的。
     */
        var test =(int)3.7 + (double)3; //6.0 (double)
    ```
    
[NEXT](https://hackmd.io/TDRwQLaiQBqOZiLbNtv1lg)
