整數 (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)。
如果字面量超出了指定的(或推論出的)大小範圍,系統將會報錯。
範例 (Examples)
// 帶有顯式標注的字面量;
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;
運算 (Operations)
算術運算 (Arithmetic)
每種整數型別都支援相同的一組受檢算術運算。對於所有這些運算,兩個引數(左側和右側運算元)必須具有相同的型別。如果您需要對不同型別的值進行運算,則需要先執行型別轉換。同樣地,如果您預期運算結果對於整數型別來說太大,請在執行運算前轉換為更大的型別。
所有算術運算在行為與數學整數不符(例如:溢位 Overflow、下溢 Underflow、除以零 Divide-by-zero)時都會中斷 (abort)。
| 語法 | 運算 | 中斷條件 (Aborts If) |
|---|---|---|
| + | 加法 (addition) | 結果對於整數型別來說太大 |
| - | 減法 (subtraction) | 結果小於零 |
| * | 乘法 (multiplication) | 結果對於整數型別來說太大 |
| % | 取模 (modular division) | 除數為 0 |
| / | 截斷除法 (truncating division) | 除數為 0 |
位元運算 (Bitwise)
整數型別支援以下位元運算,這些運算將每個數字視為一系列獨立的位元(0 或 1),而不是數值整數。
位元運算不會中斷。
| 語法 | 運算 | 描述 |
|---|---|---|
| & | 位元「與」 (bitwise and) | 對每對位元執行布林「與」運算 |
| | 位元「或」 (bitwise or) | 對每對位元執行布林「或」運算 |
| ^ | 位元「異或」 (bitwise xor) | 對每對位元執行布林「異或」運算 |
位移運算 (Bit Shifts)
與位元運算類似,每種整數型別都支援位移運算。但與其他運算不同的是,右側運算元(要位移多少位元)必須始終是 u8,且不需要與左側運算元(正在位移的數字)相匹配。
如果位移的位元數大於或等於 u8、u16、u32、u64、u128 和 u256 分別對應的 8、16、32、64、128 或 256,位移運算可能會中斷。
| 語法 | 運算 | 中斷條件 (Aborts if) |
|---|---|---|
| << | 左移 (shift left) | 位移位元數大於整數型別的大小 |
| >> | 右移 (shift right) | 位移位元數大於整數型別的大小 |
比較運算 (Comparisons)
整數型別是 Move 中唯一可以使用比較運算子的型別。兩個引數都需要具有相同的型別。如果您需要比較不同型別的整數,則必須先轉換其中一個。
比較運算不會中斷。
| 語法 | 運算 |
|---|---|
| < | 小於 (less than) |
| > | 大於 (greater than) |
| <= | 小於等於 (less than or equal to) |
| >= | 大於等於 (greater than or equal to) |
相等性 (Equality)
像所有具備 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)
與語言中內建的其他純量值 (scalar values) 一樣,整數值是隱式可複製的,這意味著它們可以在沒有顯式指令(如copy)的情況下被複製。