整數是完整的數字。它們沒有分數或小數部分。在機器中,它們以一組二進位位元的樣式來表示。
整數可以有號,也可以無號。有號是指保留數字中的其中一個位元,用來表示該數字是否為負數。
所有整數都有位元寬度,也就是組成該數字的位元數量。這會影響該整數型別所能表示的最大值。
例如,最常見的整數型別之一是u8:無號的 8 位元整數。你可能認得這個型別,它就是單一位元組。它的最小值是 0,最大值是 255。
Rust 有 12 種整數基礎型別,依位元寬度與有號性區分:
| 無號 | 有號 |
|---|---|
u8 |
i8 |
u16 |
i16 |
u32 |
i32 |
u64 |
i64 |
u128 |
i128 |
usize |
isize |
整數的位元寬度一律由u或i後面的數字表示。usize和isize比較特別:它們的寬度與目標機器上的指標相同。這表示在 64 位元架構上,usize和isize是 64 位元寬,但在 32 位元架構上,它們是 32 位元寬。
一般來說,如果你只是要表示某個數字,就用i32:32 位元的範圍夠廣,相對不容易溢位,而且有號數字比無號數字更少出人意料的情況。i32等同於 C 的long,或 Java 的int。如果你使用數值字面量而沒有明確標註型別,它會預設為i32。
如果你在處理二進位資料,用位元組來操作最簡單:&[u8]或Vec<u8>。
Rust 用usize來表示集合的大小與索引。這是因為電腦在理論上只能定址usize::MAX位元組的記憶體,所以不可能有更大的記憶體內集合。因此,如果你經常大量處理集合,usize會很有用。
如果你的資料裝不進 32 位元整數,可以考慮擴大到 64 或 128 位元整數。如果你的資料裝不進 128 位元整數,那麼你可以使用大整數型別,例如num-bigint所提供的。
16 位元整數不太常見,但在針對某些微控制器時很有用。
如果你知道你的應用程式不會有合法的負數情況,最好使用無號整數而非有號整數。計數就是一個很好的例子。
Rust 沒有隱含的數值轉換。如果你需要在整數型別之間轉型,有兩種基本策略:as關鍵字,以及From和TryFrom trait。
使用as關鍵字很簡單:expr as Type。不過,使用as轉型時,有許多注意事項與細節需要謹記在心。
以 trait 為基礎的轉型稍微複雜一些,但更安全:轉換 trait 只會在安全的地方被實作。例如,i32實作了From<u8>、From<u16>、From<i8>和From<i16>:任何這些型別能表示的值,都保證能在i32中表示。使用方式像是i32::from(expr),或expr.into(),其中expr會解析成這些型別的其中一種。i32也實作了TryFrom<u32>、TryFrom<u64>、TryFrom<u128>、TryFrom<usize>、TryFrom<i64>、TryFrom<i128>和TryFrom<isize>。這些轉換會依值明確地成功或溢位。要使用它們,你需要視情況匯入std::convert::TryFrom或std::convert::TryInto trait,然後使用i32::try_from(expr)或expr.try_into(),其中expr會解析成適當的型別。
一般來說,建議使用以 trait 為基礎的轉型,而不要用as轉型,尤其是在從較寬的型別轉換成較窄的型別時。以 trait 為基礎的轉型比as轉型稍微貴一點,但差距微不足道:為了效能而使用as並不值得,除非是在極度頻繁執行的迴圈裡。