整数类型
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 类型一样,所有整数类型都支持 “等于” 和 “不等于” 操作.两个参数必须是相同类型.如果需要比较不同类型的整数,需要先进行 类型转换.
Section titled “相等性与所有具有 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 )即可被复制.