felt252
felt252是Cairo中基础类型,代表一个存储槽,未指定变量类型的字面量默认类型都是felt252。felt252可以是负数或者是0,它的取值范围是:
-X < felt < X, where X = 2^{251} + 17* 2^{192} + 1
任何在这个取值范围内的值都可以存储在felt252中。注意⚠️:并不是 -(2^251) ~ (2^251 - 1)
。
felt252既可以存整数,也可以存储字符串,下面👇是存储整数和字符串的例子:
use debug::PrintTrait; fn main() { // let关键字声明,直接用字面量赋值,默认类型应该是felt252 let x: felt252 = 5; let y: felt252 = 'ppppppppppppppppppppppppppp'; let z: felt252 = 'ppppppppppppppppppppppppppp99999999999999'; // 溢出 x.print(); }
短字符串
短字符串用单引号表示,并且长度不能超过31个字符。短字符串本质上是felt252类型,只是表现形式为字符串,计算机通过ASCII协议将字符转换成数字。短字符串长度不能超过31个字符,本质上是不能超过felt252的最大值。
let mut my_first_initial = 'C';
felt252与整型的区别
Cairo1.0中,felt252不支持除法运算,也不支持取余,整型可以。
以下是Cairo 0.1中关于felt的描述:
flet是field elements的缩写,可以翻译为域元素。felt252与整型的区别主要体现在除法运算上。当出现不能整除的运算时,例如 7/3,整型运算的结果通常是 2,但是felt252不是。felt252 会始终满足 x3 = 7 这个等式,由于只能是整数,所以 x3 的值将会是一个巨大的整数,以至于溢出,溢出后的值刚好是 7。
在Cairo1.0中,felt252被禁止使用除法
use debug::PrintTrait; fn main() { let x = 7 / 3; x.print(); } // 以上代码将会的到如下错误 error: Trait has no implementation in context: core::traits::Div::<core::felt252> --> f_felt252.cairo:4:13 let x = 7 / 3; ^***^ Error: failed to compile: src/f_felt252.cairo
整型
核心库中包含了这些整型变量: u8, u16, u32 (usize), u64, u128, and u256
。他们都是用 felt252 实现的,并且自带整数溢出检测,溢出后触发Panic错误。
使用整型字面量时,需要显式指定字面量类型
let x = 2_u8;
但是2_u256
不可以,目前创建u256类型,需要使用其他类型来构建。u256在核心库里是一个结构体,其中的 high 和 low 涉及到 高地址段 和 低地址段 的概念,大家可以问一下AI🤖️
let z: u256 = u256 { high: 0_u128, low: 10_u128 }
不指定则默认为felt252类型
let y = 2;
运算符
整型支持大多数运算符,并且自带溢出检测,支持如下:
fn test_u8_operators() { // 计算 assert(1_u8 + 3_u8 == 4_u8, '1 + 3 == 4'); assert(3_u8 + 6_u8 == 9_u8, '3 + 6 == 9'); assert(3_u8 - 1_u8 == 2_u8, '3 - 1 == 2'); assert(1_u8 * 3_u8 == 3_u8, '1 * 3 == 3'); assert(2_u8 * 4_u8 == 8_u8, '2 * 4 == 8'); assert(19_u8 / 7_u8 == 2_u8, '19 / 7 == 2'); assert(19_u8 % 7_u8 == 5_u8, '19 % 7 == 5'); assert(231_u8 - 131_u8 == 100_u8, '231-131=100'); // 比较 assert(1_u8 == 1_u8, '1 == 1'); assert(1_u8 != 2_u8, '1 != 2'); assert(1_u8 < 4_u8, '1 < 4'); assert(1_u8 <= 4_u8, '1 <= 4'); assert(!(4_u8 < 4_u8), '!(4 < 4)'); assert(4_u8 <= 4_u8, '4 <= 4'); assert(5_u8 > 2_u8, '5 > 2'); assert(5_u8 >= 2_u8, '5 >= 2'); assert(!(3_u8 > 3_u8), '!(3 > 3)'); assert(3_u8 >= 3_u8, '3 >= 3'); }
Boolean
可以使用如下方式进行声明
let is_morning:bool = true; let is_evening:bool = false;
Float
暂不支持
评论前必须登录!
注册