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)。

如果常值對於其指定(或推斷出的)大小範圍來說太大,則會報錯。

範例

// 帶有明確註解的常值;
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,且不需要與左側運算元(被位移的數字)匹配。

如果位移的位元數大於或等於該類型的位元數(對於 u8u16u32u64u128u256 分別為 8163264128256),位移運算會發生終止。

語法操作終止條件 (Aborts if)
<<左移位移位元數大於或等於整數類型的長度
>>右移位移位元數大於或等於整數類型的長度

比較運算

整數類型是 Move 中 唯一 可以使用比較運算子的類型。兩個參數都需要具有相同的類型。如果您需要比較不同類型的整數,您必須先 轉型 其中之一。

比較運算不會發生終止。

語法操作
<小於
>大於
<=小於或等於
>=大於或等於

相等性質

與所有具備 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)

與語言中內建的其他純量值一樣,整數值是隱式可複製的,這意味著它們可以在沒有明確指令(如 copy)的情況下被複製。