整數

整數 在 Rust

1 個練習

關於 整數

整數是完整的數字。它們沒有分數或小數部分。在機器中,它們以一組二進位位元的樣式來表示。

整數可以有號,也可以無號。有號是指保留數字中的其中一個位元,用來表示該數字是否為負數。

所有整數都有位元寬度,也就是組成該數字的位元數量。這會影響該整數型別所能表示的最大值。

例如,最常見的整數型別之一是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並不值得,除非是在極度頻繁執行的迴圈裡。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟