整数类型
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 |
字面量
这些类型的字面量可以表示为数字序列(如 112
)或十六进制字面量(如 0xFF
)。类型可以通过后缀显式指定(如 112u8
)。如果未指定类型,编译器会根据使用上下文推断类型。若无法推断类型,则默认采用 u64
。
数字字面量可以使用下划线进行分组以提高可读性(例如 1_234_5678
、1_000u128
、0xAB_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 转换为整数类型 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)
请注意,自从语言版本 2.0 开始,类型转换不一定需要括号。因此 x as u8
是合法的表达式。
所有权
与其他内置标量类型类似,整数值是隐式可复制的( implicitly copyable ),这意味着它们无需显式指令(如 copy
)即可被复制。