Skip to main content

整數 (Integers)

Move 支援六種無符號整數型別:u8、u16、u32、u64、u128 與 u256。這些型別的值範圍從 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_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)​

每種型別都支援相同的一組受檢查算術運算。對於所有這些運算,兩個引數(左側與右側運算元)都 必須 是相同型別。若你需要對不同型別的值進行運算,必須先進行型別轉換。同樣地,若你預期運算結果對整數型別而言過大,請在進行運算前先轉換為較大的型別。

所有算術運算都會中止,而不會以不符合數學整數規則的方式運作(例如溢位、下溢或除以零)。

語法運算中止條件
+加法結果對整數型別而言過大
-減法結果小於零
*乘法結果對整數型別而言過大
%模除法除數為 0
/截斷除法除數為 0

位元運算 (Bitwise)​

整數型別支援下列位元運算;這些運算將每個數字視為由個別的 0 或 1 位元組成的序列,而非數值整數值。

位元運算不會中止。

語法運算說明
&位元 AND對每一對位元執行布林 AND
|位元 OR對每一對位元執行布林 OR
^位元 XOR對每一對位元執行布林互斥 OR

位元位移 (Bit Shifts)​

與位元運算相同,每種整數型別都支援位元位移。但與其他運算不同的是,右側運算元(要位移的位元數)一律 必須是 u8,且不需要與左側運算元(你要位移的數字)相同型別。

對於 u8、u16、u32、u64、u128 與 u256,若要位移的位元數分別大於或等於 8、16、32、64、128 或 256,位元位移可能會中止。

語法運算中止條件
<<左位移要位移的位元數大於整數型別的大小
>>右位移要位移的位元數大於整數型別的大小

比較 (Comparisons)​

整數型別是 Move 中唯一可以使用比較運算子的型別。兩個引數必須是相同型別。若你需要比較不同型別的整數,必須先對其中一個進行型別轉換。

比較運算不會中止。

語法運算
<小於
>大於
<=小於或等於
>=大於或等於

相等性 (Equality)​

如同所有具有 drop 的型別,所有整數型別都支援「相等」與「不相等」運算。兩個引數必須是相同型別。若你需要比較不同型別的整數,必須先對其中一個進行型別轉換。

相等性運算不會中止。

語法運算
==相等
!=不相等

如需更多詳細資訊,請參閱相等性章節。

型別轉換 (Casting)​

一種大小的整數型別可以轉換為另一種大小的整數型別。整數是 Move 中唯一支援型別轉換的型別。

型別轉換不會截斷。若結果對指定型別而言過大,型別轉換會中止。

語法運算中止條件
(e as T)將整數運算式 e 轉換為整數型別 Te 過大,無法表示為 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 等明確指令即可複製。