在C#裡面,變量類型主要分為引用類型和值類型(還有一個指針類型,但我個人很少使用),而值類型之中,最常用的除了struct, enum這類特殊的類型以外,就剩下bool、整型、浮點三類。我們在日常使用時,除了用來判斷true和false的bool以外,基本都是整數用int,浮點數用float。
在浮點數的情況下,確實是沒有比float更好的選擇了,雖然還可以用double或者decimal,但是它們所佔用的空間要比float多得多。
但在整數的情況下又是怎樣呢?我們來看一下整型值類型的空間佔用情況。
首先,我們要知道內存裡最基本的的單位是bit,取值範圍是0和1。而整型類型最小的單位則是byte,而byte等於8bit,也就是說:
- 1 bit = 0 -> 1
- 1 byte = 0000 0000 -> 1111 1111
- 在十進制中,等同0 -> 255
但是byte是沒有負數的,如果包含負數,那就是sbyte:取值範圍從-128 -> 127。所以無論是byte還是sbyte,它們所佔用的容量空間都是不變的,依然是8-bit,只是指代的數字區間不一樣。接下來,就是byte之上的整型值類型:
- 16-bit
0000 0000 0000 0000 -> 1111 1111 1111 1111
- short
- -32,768 -> 32,767
- ushort
- 0 -> 65,535
- 32-bit
0000 0000 0000 0000
0000 0000 0000 0000 ->
1111 1111 1111 1111
1111 1111 1111 1111
- int
- -2,147,483,648 -> 2,147,483,647
- uint
- 0 -> 4,294,967,295
- 64-bit
- 0000 0000 0000 0000
- 0000 0000 0000 0000
- 0000 0000 0000 0000
- 0000 0000 0000 0000 ->
- 1111 1111 1111 1111
- 1111 1111 1111 1111
- 1111 1111 1111 1111
- 1111 1111 1111 1111
- long
- -9,223,372,036,854,775,808 -> 9,223,372,036,854,775,807
- ulong
- 0 -> 18,446,744,073,709,551,615
可以看到,我們常用的int在整型值類型中所佔用的空間是非常龐大的。我們其實很多時候,都用不完這麼多的數值空間,我們可能只是聲明一個int speed的變量,它的值最大也不會超過1000,但是只要我們聲明了,對應的空間就會被佔用,也就是說,可以用16-bit解決的問題,我們足足多用了一倍的內存去解決。因此,根據變量的可能取值區間去判斷要用哪種值類型數據,可以有效減少記憶體的消耗。
當然,另一方面也注意的是,int本身的通用性也是最廣泛的,基本所有常用的,用於操作數值的靜態方法都能返回int,但不一定能返回short, byte這樣的整型值類型,比如UnityEngine.Random.Range就只返回int 或 float 類型的數值,如果要用在byte類型的變量上,還要進行一步強轉,相對於直接用int肯定是要慢一些,所以最後又回到了時間和空間的取捨問題上了。