Cairo1.0中的标量类型(felt,integer,boolean,float)

  • A+
所属分类:以太坊ETH

chatGPT账号

Cairo1.0中的标量类型(felt,integer,boolean,float)

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

暂不支持

免责声明

发文时比特币价格:$31249

当前比特币价格:[crypto coins=”BTC” type=”text” show=”price”]

当前比特币涨幅:[crypto coins=”BTC” type=”text” show=”percent”]

免责声明:

本文不代表路远网立场,且不构成投资建议,请谨慎对待。用户由此造成的损失由用户自行承担,与路远网没有任何关系;

路远网不对网站所发布内容的准确性,真实性等任何方面做任何形式的承诺和保障;

网站内所有涉及到的区块链(衍生)项目,路远网对项目的真实性,准确性等任何方面均不做任何形式的承诺和保障;

网站内所有涉及到的区块链(衍生)项目,路远网不对其构成任何投资建议,用户由此造成的损失由用户自行承担,与路远网没有任何关系;

路远区块链研究院声明:路远区块链研究院内容由路远网发布,部分来源于互联网和行业分析师投稿收录,内容为路远区块链研究院加盟专职分析师独立观点,不代表路远网立场。

 

本文是全系列中第254 / 309篇:行业技术

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的电报
  • 这是我的电报扫一扫
  • weinxin
chatGPT账号
路远

发表评论

您必须登录才能发表评论!