整数类型

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

如果字面值超出了指定(或推断)类型的范围,会报告错误。

示例

// 带显式注释的字面值
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 类型,不必与左侧操作数(要移位的数字)类型匹配。

如果移位位数大于或等于 8163264128256(对于 u8u16u32u64u128u256),位移运算会中止。

语法操作中止条件
<<左移移位位数大于整数类型的位数
>>右移移位位数大于整数类型的位数

比较运算

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

比较运算不会中止。

语法操作
<小于
>大于
<=小于等于
>=大于等于

相等运算

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

相等运算不会中止。

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

更多细节请参见相等部分。

类型转换

一种整数类型可以转换为另一种整数类型。整数是 Move 语言中唯一支持类型转换的类型。

类型转换_不会_截断。如果结果超出指定类型的范围,转换会中止。

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

在这里,e 的类型必须是 8163264128256T 必须是 u8u16u32u64u128u256

例如:

  • (x as u8)
  • (y as u16)
  • (873u16 as u32)
  • (2u8 as u64)
  • (1 + 3 as u128)
  • (4/2 + 12345 as u256)

所有权

与语言中其他标量值一样,整数值是隐式可复制的,这意味着它们可以在不需要显式指令(如 copy)的情况下进行复制。