整數 (Integers)
Move 支援六種無號整數類型:u8、u16、u32、u64、u128 和 u256。這些類型的數值範圍從 0 到視類型大小而定的最大值。
| 類型 | 數值範圍 |
|---|---|
| 無號 8 位元整數, u8 | 0 到 28 - 1 |
| 無號 16 位元整數, u16 | 0 到 216 - 1 |
| 無號 32 位元整數, u32 | 0 到 232 - 1 |
| 無號 64 位元整數, u64 | 0 到 264 - 1 |
| 無號 128 位元整數, u128 | 0 到 2128 - 1 |
| 無號 256 位元整數, u256 | 0 到 2256 - 1 |
常值 (Literals)
這些類型的常值可以指定為數字序列(例如 112)或十六進制常值(例如 0xFF)。常值的類型可以選擇性地添加為後綴,例如 112u8。如果未指定類型,編譯器將嘗試從使用常值的上下文推斷類型。如果無法推斷類型,則預設為 u64。
數字常值可以使用底線分隔,以進行分組並提高可讀性(例如 1_234_5678、1_000u128、0xAB_CD_12_35)。
如果常值對於其指定(或推斷出的)大小範圍來說太大,則會報錯。
範例
// 帶有明確註解的常值;
let explicit_u8 = 1u8;
let explicit_u16 = 1u16;
let explicit_u32 = 1u32;
let explicit_u64 = 2u64;
let explicit_u128 = 3u128;
let explicit_u256 = 1u256;
let explicit_u64_underscored = 154_322_973u64;
// 帶有簡單推斷的常值
let simple_u8: u8 = 1;
let simple_u16: u16 = 1;
let simple_u32: u32 = 1;
let simple_u64: u64 = 2;
let simple_u128: u128 = 3;
let simple_u256: u256 = 1;
// 帶有較複雜推斷的常值
let complex_u8 = 1; // 推斷為: u8
// 位移運算的右側參數必須為 u8
let _unused = 10 << complex_u8;
let x: u8 = 38;
let complex_u8 = 2; // 推斷為: u8
// `+` 的參數必須具有相同的類型
let _unused = x + complex_u8;
let complex_u128 = 133_876; // 推斷為: u128
// 從函式參數類型推斷
function_that_takes_u128(complex_u128);
// 常值可以用十六進制編寫
let hex_u8: u8 = 0x1;
let hex_u16: u16 = 0x1BAE;
let hex_u32: u32 = 0xDEAD80;
let hex_u64: u64 = 0xCAFE;
let hex_u128: u128 = 0xDEADBEEF;
let hex_u256: u256 = 0x1123_456A_BCDE_F;
操作
算術運算
每種整數類型都支援相同的一組受檢查的算術操作。對於所有這些操作,兩個參數(左側和右側運算元)必須 具有相同的類型。如果您需要對不同類型的數值進行操作,則需要先執行 轉型 (cast)。同樣地,如果您預期運算結果對於該整數類型來說太大,請在執行運算前先 轉型 為更大的類型。
所有的算術運算在行為與數學整數不符(例如:溢位、下溢、除以零)時都會終止 (abort)。
| 語法 | 操作 | 終止條件 (Aborts If) |
|---|---|---|
| + | 加法 | 結果對於該整數類型來說太大 |
| - | 減法 | 結果小於零 |
| * | 乘法 | 結果對於該整數類型來說太大 |
| % | 取模除法 | 除數為 0 |
| / | 捨去除法 | 除數為 0 |
位元運算
整數類型支援以下位元運算,將每個數字視為一系列獨立的位元(0 或 1),而非數字整數值。
位元運算不會發生終止。
| 語法 | 操作 | 描述 |
|---|---|---|
| & | 位元與 (and) | 對每一對位元執行邏輯與運算 |
| | 位元或 (or) | 對每一對位元執行邏輯或運算 |
| ^ | 位元異或 (xor) | 對每一對位元執行邏輯異或運算 |
位元位移 (Bit Shifts)
與位元運算類似,每種整數類型都支援位移運算。但與其他操作不同的是,右側運算元(位移多少位元)必須 始終 為 u8,且不需要與左側運算元(被位移的數字)匹配。
如果位移的位元數大於或等於該類型的位元數(對於 u8、u16、u32、u64、u128 和 u256 分別為 8、16、32、64、128 或 256),位移運算會發生終止。
| 語法 | 操作 | 終止條件 (Aborts if) |
|---|---|---|
| << | 左移 | 位移位元數大於或等於整數類型的長度 |
| >> | 右移 | 位移位元數大於或等於整數類型的長度 |
比較運算
整數類型是 Move 中 唯一 可以使用比較運算子的類型。兩個參數都需要具有相同的類型。如果您需要比較不同類型的整數,您必須先 轉型 其中之一。
比較運算不會發生終止。
| 語法 | 操作 |
|---|---|
| < | 小於 |
| > | 大於 |
| <= | 小於或等於 |
| >= | 大於或等於 |
相等性質
與所有具備 drop 能力的類型一樣,所有整數類型都支援 "相等" 和 "不相等" 操作。兩個參數都需要具有相同的類型。如果您需要比較不同類型的整數,您必須先 轉型 其中之一。
相等運算不會發生終止。
| 語法 | 操作 |
|---|---|
| == | 等於 |
| != | 不等於 |
更多細節請參見 相等性 章節。
轉型 (Casting)
一個大小的整數類型可以轉型為另一種大小的整數類型。整數是 Move 中唯一支援轉型的類型。
轉型 不會 發生截斷。如果結果對於指定類型來說太大,轉型會發生終止。
| 語法 | 操作 | 終止條件 (Aborts if) |
|---|---|---|
| (e as T) | 將整數表達式 e 轉型為整數類型 T | e 太大而無法表示為 T |
這裡,e 的類型必須是 8、16、32、64、128 或 256,而 T 必須是 u8、u16、u32、u64、u128 或 u256。
例如:
- (x as u8)
- (y as u16)
- (873u16 as u32)
- (2u8 as u64)
- (1 + 3 as u128)
- (4/2 + 12345 as u256)
所有權 (Ownership)
與語言中內建的其他純量值一樣,整數值是隱式可複製的,這意味著它們可以在沒有明確指令(如 copy)的情況下被複製。