整數

Prerequisites:

Java的整數有下面4種,Java程式碼是在Java虛擬機上執行,不會有不同作業系統型別會有所不同,但C++的long類型在Win與Linux下是不同的。

為什麼要不同的基本型態,因為記憶體空間有限,不能把任何整數都放在long,這樣是很浪費記憶體空間。

名稱 byte數 範圍
byte 1 byte -128 至 127
short 2 byte $-2 ^{15}$ 至 $2 ^{15} - 1$
int 4 byte $-2 ^{31}$ 至$2 ^{31} - 1$
long 8 byte $-2 ^{63}$ 至$2 ^{63} - 1$

占據記憶體bit,byte數量

1個Byte由8個bit組成的,下圖為各種基本型態占據記憶體的bit數量。

img

下圖方格子代表1byte,下圖為各種基本型態占據記憶體的byte數量。

img

下圖中,各種型態都存入127,127是1byte,但對每一種基本型態的意義是不同的,short存入127,short占據記憶體空間是2byte,int存入127,int占據記憶體空間是4byte,long存入127,long占據記憶體空間是8byte。

img

不同型態占據記憶體空間大小不一樣,雖然存的值都相同。

1
2
3
4
byte b1 = 127;   // 1 byte
short s1 = 127;  // 2 byte
int i1 = 127;    // 4 byte
long l1 = 127;   // 8 byte

不能把4個byte的int,存入1個byte的byte,記憶體空間大小不一樣,以下程式碼編譯錯誤。

1
2
int i1 = 127;
byte b1 = i1;

但反過來把1個byte的值存入4個byte中,是可以,從小房子搬到大房子。

1
2
byte b1 = 127;
int i1 = b1;

自動轉型

資料型態小的可以塞入大的資料型態,不用手動轉型,編譯器會自動轉型,

byte型態放入int型態。

1
2
byte b1 = 127;
int i1 = b1;

強制轉型

資料型態大的塞入小的資料型態,要使用強制轉型,使用圓括號(轉型的型態),程式設計師要負責轉換後精度遺失或超出資料範圍的問題。

int型態放入byte型態。

1
2
int i1 = 127;
byte b1 = (byte) i1;

強制轉型只會轉型離自己最近的變數。

以下編譯錯誤,因為只有強制轉型10,並非轉型整個公式的結果。

1
int i2 = (int)10 * 1.1 * 5;

正確寫法如下,使用圓括號(公式),強制轉型公式的結果。

1
int i2 = (int)(10 * 1.1 * 5);

預設整數常數型態

什麼是常數?等號右邊若為數字或字串,這些就是常數。

1
2
int i = 123;  // 123是常數
String s = "Hello"  // Hello是常數

在程式碼任意輸入數字,預設是int。

以下1234是int。

1
System.out.println(1234);

範圍檢查

整數預設型態是int。

以下程式碼等號右邊是int的「值」,但java編譯器會先檢查範圍,介於範圍之間,就可以設值。

1
2
3
4
5
6
7
8
  byte b1 = 127;
  byte b2 = -128;
  short s1 = 32767;
  short s2 = -32768;
  System.out.println(b1);
  System.out.println(b2);
  System.out.println(s1);
  System.out.println(s2);
127
-128
32767
-32768

但如果不是「值」,而是基本型態,以下程式碼編譯錯誤。

1
2
  int i1 = 127;
  byte b1 = i1;

不能把大的型態塞到小的型態

int是4byte,不能放入short 2byte。

1
2
int i1 = 123;
short s1 = i1;

byte

byte等號右邊的範圍大小就是-128 至 127,超過就會編譯錯誤。

1
2
3
4
  byte b1 = 127;
  System.out.println(b1);
  byte b2 = -128;
  System.out.println(b2);
127
-128

以下會產生編譯錯誤。

1
  byte b1 = 128;

以下會產生編譯錯誤,不能把大的型態塞入小的型態,int是4byte,byte的1個byte。

1
2
int i1 = 123;
byte b1 = i1;

short

short等號右邊的範圍大小就是-32768 至 32767,超過就會編譯錯誤。

1
2
  short s1 = 32767;
  short s2 = -32768;

byte、short計算

byte、short計算結果是int,不能把int塞入byte或short。

以下b1 + s1是int型態,以下編譯錯誤。

1
2
3
  byte b1 = 1;
  short s1 = 1;
  short s2 = b1 + s1;

以下s1 + s2是int型態,以下編譯錯誤。

1
2
3
  short s1 = 1;
  short s2 = 1;
  short s3 = s1 + s2;

以下b1 + b2是int型態,以下編譯錯誤。

1
2
3
  byte b1 = 1;
  byte b2 = 1;
  byte b3 = b1 + b2;

正確的方式,把計算過後的值指派給int。

1
2
3
  byte b1 = 1;
  byte b2 = 1;
  int i = b1 + b2;

正確的方式,把計算結果強制轉型成byte,需要把公式用圓括號()包住,之前有提過強制轉型只轉型最近的變數,不包住就只轉型b1。

1
2
3
  byte b1 = 1;
  byte b2 = 1;
  byte b3 = (byte)(b1 + b2);

byte short不能與char互相轉換。

byte是1byte,char是2byte,byte比char小,但也不能指派給char。

以下編譯錯誤。

1
2
  byte b1 = 1;
  char c = b1;

以下編譯錯誤。

1
2
  short s1 = 1;
  char c = s1;

long

常數後面要為l或L,代表為long基本型態。

1
2
3
4
  long l1 = 10l;
  long l2 = 10L;
  System.out.println(l1);
  System.out.println(l2);
10
10

注意!執行結果為10,不是10.0,不要跟double搞混。

int

int最大的數字是2147483647,若存放的數字超過int最大數字,請使用long。

1
  int i = 10;

小數無條件捨去

1
2
int i = (int)1.9;
System.out.println(i);
1

int計算時,只保留整數,小數無條件捨去。

1
2
int i = 10 / 4;
System.out.println(i);
2

整數與String互相轉型

整數轉String使用 + ""

String轉成其它基本型態,每個基本型態都有對映的包裝類別,包裝類別有提供一個parseXX()方法,提供String轉型成某個數字類型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
byte b1 = Byte.parseByte("127");
System.out.println(b1);
String strb1 = b1 + "";
System.out.println(strb1);

short s1 = Short.parseShort("55");
System.out.println(s1);
String strs1 = s1 + "";
System.out.println(strs1);

int i1 = Integer.parseInt("100");
System.out.println(i1);
String stri1 = i1 + "";
System.out.println(stri1);

long l1 = Long.parseLong("1000");
System.out.println(l1);
String strl1 = l1 + "";
System.out.println(strl1);
127
127
55
55
100
100
1000
1000

也可以使用String.valueOf()來轉型成String。

1
2
int i2 = 98;
String s = String.valueOf(i2);

results matching ""

    No results matching ""