跳转到内容

整数类型

Move 语言支持六种无符号整数类型:u8,u16,u32,u64,u128u256.这些类型的取值范围从 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_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 中 唯一可以 使用比较运算符的类型.两个参数必须是相同类型.如果需要比较不同类型的整数,需要先进行类型转换.

比较运算不会中止.

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

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

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

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

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

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

语法操作中止条件
(e as T)将整数表达式 e 转换为整数类型 Te 的值超出 T 类型的表示范围时

其中 e 的类型必须是 8,16,32,64,128256 位,T 必须是 u8,u16,u32,u64,u128u256.

例如:

  • (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 )即可被复制.