Skip to content
🎉 Welcome to the new Aptos Docs! Click here to submit an issue.

整数类型

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

字面量

这些类型的字面量可以表示为数字序列(如 112)或十六进制字面量(如 0xFF)。类型可以通过后缀显式指定(如 112u8)。如果未指定类型,编译器会根据使用上下文推断类型。若无法推断类型,则默认采用 u64

数字字面量可以使用下划线进行分组以提高可读性(例如 1_234_56781_000u1280xAB_CD_12_35)。

如果字面量超出指定(或推断)类型的取值范围,编译器会报错。

示例

script {
  fun example() {
    // 带显式类型标注的字面量
    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;
  }
}

运算操作

算术运算

所有整数类型都支持相同的检查型算术运算。注意:

  • 所有运算的两个操作数(左值和右值)必须是相同类型
  • 如需对不同类型进行运算,需要先进行 类型转换
  • 如果运算结果可能超出当前整数类型的范围,应预先 转换 为更大的类型在执行操作前。

所有算术运算会在不符合数学整数行为时中止(例如溢出、下溢、除零)。

语法运算中止条件
+加法结果超出整数类型范围
-减法结果小于零
*乘法结果超出整数类型范围
%取模除法除数为0
/截断除法除数为0

位运算

整数类型支持以下位运算,这些运算将每个数字视为单独的位序列( 0 或 1 ),而不是数值整数。

位运算不会中止。

语法运算描述
&按位与对每对位执行布尔与运算
|按位或对每对位执行布尔或运算
^按位异或对每对位执行布尔异或运算

位移

与位运算类似,每种整数类型都支持位移操作。但与其他操作不同,右侧操作数(位移位数)必须始终是 u8 类型,且不需要与左侧操作数(被移位数)类型匹配。

如果位移位数大于或等于整数类型的位数( u8 对应 8 位, u16 对应 16 位,依此类推),位移操作将中止。

语法运算中止条件
<<左移位移位数大于或等于整数类型的位数
>>右移位移位数大于或等于整数类型的位数

比较运算

整数类型是 Move 中 唯一可以 使用比较运算符的类型。两个参数必须是相同类型。如果需要比较不同类型的整数,需要先进行类型转换

比较运算不会中止。

语法运算
<小于
>大于
<=小于等于
>=大于等于

相等性与所有具有 drop 能力的 Move 类型一样,所有整数类型都支持 “等于”“不等于” 操作。两个参数必须是相同类型。如果需要比较不同类型的整数,需要先进行 类型转换

相等操作不会导致程序中止。

语法操作
==等于
!=不等于

更多细节请参阅 相等性 章节

类型转换

整数类型可以相互进行大小转换。整数是 Move 中唯一支持类型转换的类型。

转换 不会 截断数据。如果结果超出目标类型的表示范围,转换将中止

语法操作中止条件
(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)

请注意,自从语言版本 2.0 开始,类型转换不一定需要括号。因此 x as u8 是合法的表达式。

所有权

与其他内置标量类型类似,整数值是隐式可复制的( implicitly copyable ),这意味着它们无需显式指令(如 copy )即可被复制。