整数类型
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
)即可被复制.