integer 是没有小数部分的数字。
在 Cairo 中,整数的类型声明指明了程序员可以用来存储该值的位数。
无符号整数只能表示正数和数字 0(零),这在某些编程场景中很有用,例如数组下标和内存管理。
Cairo 也支持有符号整数,它们以i为前缀。
这些整数可以表示正数和负数,大小从i8到i128。
每个有符号变体可以存储从 $-2^{n-1}$ 到 $2^{n-1} - 1$(含两端)的数字,其中 $n$ 是该变体使用的位数。
例如,i8可以存储从 $-2^7$ 到 $2^7 - 1$ 的数字,也就是从 $-128$ 到 $127$。
| 长度 | 无符号 | 有符号 |
|---|---|---|
| 8 位 | u8 | i8 |
| 16 位 | u16 | i16 |
| 32 位 | u32 | i32 |
| 64 位 | u64 | i64 |
| 128 位 | u128 | i128 |
| 256 位 | u256 | ------ |
还有一种特殊的整数类型叫usize,它目前只是u32的别名。
将来,一旦 Cairo 可以编译为 MLIR(多级中间表示),这种类型可能会发挥更独特的作用。
你可以用下表所示的任意形式书写整数字面量。
注意,可以属于多种数字类型的数字字面量允许添加类型后缀,例如57_u8,用来指定类型。
也可以为数字字面量使用可视分隔符_,以提高代码可读性。
| 数字字面量 | 示例 |
|---|---|
| 十进制 | 98222 |
| 十六进制 | 0xff |
| 八进制 | 0o04321 |
| 二进制 | 0b01 |
那么,怎么知道该用哪种整数类型?
试着估算你的整数可能达到的最大值,然后选择合适的大小。
你使用usize的主要场景是对某种集合进行下标访问时。
Cairo 支持所有整数类型都有的基本数学运算:加法、减法、乘法、除法和求余。
整数除法会向零截断到最接近的整数。
以下代码展示了如何在let语句中使用每种数值运算:
fn main() {
// addition
let sum = 5_u128 + 10_u128;
// subtraction
let difference = 95_u128 - 4_u128;
// multiplication
let product = 4_u128 * 30_u128;
// division
let quotient = 56_u128 / 32_u128; // result is 1
let quotient = 64_u128 / 32_u128; // result is 2
// remainder
let remainder = 43_u128 % 5_u128; // result is 3
}
这些语句中的每个表达式都使用一个数学运算符并求值为单个值,然后绑定到一个变量。
你可以在 The Cairo Book 中找到 Cairo 提供的所有运算符。