【Java】特色的變量類型與運算符


基於我們對C++的瞭解,下面只講解Java語言部分獨特的變量數據與運算符特性。

變量類型

範圍溢出

Java 中, 一個 int 變量佔4 個字節. 和操作系統沒有直接關係

  • 什麼是字節?
  • 字節是計算機中表示空間大小的基本單位.
    計算機使用二進制表示數據. 我們認爲 8 個二進制位(bit) 爲一個字節(Byte).
    平時的計算機爲 8GB 內存, 意思是 8G 個字節.
    其中 1KB = 1024 Byte, 1MB = 1024 KB, 1GB = 1024 MB.
    所以 8GB 相當於 80 多億個字節.
  • 4 個字節表示的數據範圍是 -2^31 -> 2^31-1 , 也就約是 -21億 到 +21億.

使用以下代碼查看 Java 中的整型數據範圍:
如果運算的結果超出了 int 的最大範圍, 就會出現溢出的情況,21億這樣的數字對於當前的大數據時代來說, 是很容易超出的. 針對這種情況, 我們就需要使用更大範圍的數據類型來表示了. Java 中提供了 long 類型.

class Test{
    public static void main(String[] args){
        int max = Integer.MAX_VALUE + 1;
        int min = Integer.MIN_VALUE - 1;
        
        long maxL = (long)Integer.MAX_VALUE + 1;
        long minL = (long)Integer.MIN_VALUE - 1;
        
        System.out.println(Integer.MAX_VALUE + " " + Integer.MIN_VALUE);
        System.out.println(max + " " + min);
        System.out.println(maxL + " " + minL);
    }
}

輸出結果:

2147483647 -2147483648
-2147483648 2147483647
2147483648 -2147483649

分析:

  • 第一行輸出的爲int類型數據的最大與最小的表示範圍。
  • 第二行爲int類型數據溢出之後的表示值,上限加一變爲下限,下限減一變爲上限。
  • int類型的上下限加一或減一仍爲int型數據,未發生整型提升。所以將它強制轉換爲long類型數據且用long進行接收,如願獲得比上限大一的數據,下限亦然,因爲long類型數據的表示範圍廣於int類型。

長整型變量(long)注意事項:

  1. 基本語法格式和創建 int 變量基本一致, 只是把類型修改成 long
  2. 初始化設定的值爲 10L , 表示一個長整型的數字. 10l也可以.
  3. Java 中 long 類型佔 8 個字節. 表示的數據範圍 -2^63 -> 2^63-1

再看看long類型的範圍:

System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);

輸出結果:

9223372036854775807
-9223372036854775808

這個數據範圍遠超過 int 的表示範圍,足夠絕大部分的工程場景中使用。


char 類型特色

Java 中使用 單引號 + 單個字母 的形式表示字符字面值。如char ch = 'A';

計算機中的字符本質上是一個整數. 在 C 語言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符。
因此一個字符佔用2個字節, 表示的字符種類更多, 包括中文

char ch = '陸';
System.out.println(ch); 

執行 javac 的時候可能出現以下錯誤:

Test.java:3: 錯誤: 未結束的字符文字
 char ch = '鍛?'; 
            ^ 

這是因爲編譯涉及編碼問題,此時我們在執行 javac 時加上 -encoding UTF-8 選項即可,表示用UTF-8的編碼格式進行編譯,可以正常輸出。

javac -encoding UTF-8 Test.java 

double 類型特色

在 Java 中, int 除以int的值仍然是 int(會直接捨棄小數部分)。

Java 中的 double 雖然也是 8 個字節, 但是**浮點數的內存佈局和整數差別很大, **不能單純的用 2 ^ n 的形式表示數據範圍。
Java 的 double 類型的內存佈局遵守 IEEE 754 標準(和C語言一樣), 嘗試使用有限的內存空間表示可能無限的小數, 勢必會存在一定的精度誤差。

舉例:

double num = 1.1;
System.out.println(num * num);

// 執行結果
1.2100000000000002 

字節類型 (byte)

Java獨特的數據類型,其基本語法格式爲:

byte 變量名 = 初始值;

代碼示例:

byte value = 0;
System.out.println(value);

注意事項:

  1. 字節類型表示的也是整數. 只佔1個字節, 表示範圍較小 ( -128 ~ +127 )
  2. 字節類型和字符類型互不相干。

布爾類型 (boolean)

不同於C++中變量是否爲0/NULL等的判斷方式,Java中只可以由boolean類型變量判斷,其基本語法格式爲:

boolean 變量名 = 初始值;

代碼示例:

boolean value = true;
System.out.println(value);

注意事項:

  1. boolean 類型的變量只有兩種取值, true 表示真, false 表示假。
  2. boolean 類型有些 JVM 的實現是佔 1個 字節, 有些是佔1個 比特位, 這個沒有明確規定
  3. Java 的 boolean 類型和int 不能相互轉換, 不存在像C/C++中 1 表示 true, 0 表示 false 這樣的用法。
boolean value = true;
System.out.println(value + 1);

// 代碼編譯會出現如下錯誤:
Test.java:4: 錯誤: 二元運算符 '+' 的操作數類型錯誤
 System.out.println(value + 1);
 ^
 第一個類型: boolean
 第二個類型: int
1 個錯誤

變量命名規則

硬性指標:

  1. 一個變量名只能包含數字, 字母, 下劃線
  2. 不能以數字開頭。
  3. 變量名是大小寫敏感。
    注意: 雖然語法上也允許使用中文/美元符($)命名變量, 但是 強烈 不推薦這樣做。

軟性指標:

  1. 變量命名要具有描述性, 見名知意。
  2. 變量名不宜使用拼音(但是不絕對)。
  3. 變量名的詞性推薦使用名詞。
  4. Java中獨特推薦變量命名爲 小駝峯命名法, 當一個變量名由多個單詞構成的時候, 除了第一個單詞之外, 其他單詞首字母都大寫

運算符

在短路求值中我們會遇到類似於10 / 0之類的運算, 因爲涉及除零的操作會涉及到Java中的異常機制,導致程序拋出異常,此體系之後講解,目前僅作知悉。

移位運算符 (>>>)

意爲無符號右移
>>>: 最右側位不要了, 最左側補 0.

int a = 0xffffffff;
System.out.printf("%x\n", a >>> 1);

// 運行結果(按十六進制打印的)
7fffffff 

取餘運算符特色 (%)

Java 中的取餘不僅針對與int類型數據,double類型也同樣可以使用。

System.out.println(11.5 % 2.0);

// 運行結果
1.5 

小結

  1. %操作在 Java 中也能針對 double 來計算。
  2. 由於 Java 是強類型語言, 因此對於類型檢查較嚴格, 因此像 && 之類的運算操作數必須是 boolean

整體來看, Java 的運算符的基本規則和 C 語言基本一致,記住一些常見的特殊點即可常規使用。

發佈了197 篇原創文章 · 獲贊 304 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章