Skip to main content

整數 (Integers)

Move 支援六種無符號整數型別:u8u16u32u64u128u256。這些型別的取值範圍從 0 到取決於型別大小的最大值。

型別取值範圍
無符號 8 位元整數, u80 到 28 - 1
無符號 16 位元整數, u160 到 216 - 1
無符號 32 位元整數, u320 到 232 - 1
無符號 64 位元整數, u640 到 264 - 1
無符號 128 位元整數, u1280 到 2128 - 1
無符號 256 位元整數, u2560 到 2256 - 1

字面量 (Literals)

這些型別的字面量可以指定為數字序列(例如 112)或十六進位字面量(例如 0xFF)。字面量的型別可以選擇性地以後綴指定,例如 112u8。如果未指定型別,編譯器將嘗試從使用字面量的上下文推論型別。如果無法推論型別,則預設為 u64

數字字面量可以使用底線分隔以進行分組並提高可讀性(例如 1_234_56781_000u1280xAB_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,且不需要與左側運算元(正在位移的數字)相匹配。

如果位移的位元數大於或等於 u8u16u32u64u128u256 分別對應的 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 轉換為整數型別 Te 太大,無法表示為 T

在這裡,e 的型別必須是 8163264128256 之一,且 T 必須是 u8u16u32u64u128u256 之一。

範例:

  • (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)的情況下被複製。