StarknetAstro

StarknetAstro

03_Cairo中のスカラータイプ(フェルト、整数、ブール、浮動小数点数)

03_Cairo 中のスカラータイプ(felt、integer、boolean、float)#

この記事で使用されている Cairo コンパイラのバージョン:2.0.0-rc0。Cairo は急速に更新されているため、異なるバージョンの構文にはわずかな違いがありますが、将来的には記事の内容を安定したバージョンに更新します。

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();
}

注意:252 ではなく 256 であり、felt の後に他の数字を付けたり付けなかったりするとコンパイルエラーになります。例えば、felt256 felt

短い文字列#

短い文字列はシングルクォートで表され、長さは 31 文字を超えることはできません。短い文字列は本質的には felt252 の型であり、コンピュータは ASCII プロトコルを使用して文字を数字に変換します。短い文字列の長さは 31 文字を超えることはできず、本質的には felt252 の最大値を超えることはできません。

let mut my_first_initial = 'C';

felt252 と整数の違い#

Cairo1.0 では、felt252 は除算や剰余演算をサポートしていませんが、整数はサポートしています。

以下はCairo 0.1での felt に関する説明です:

felt は 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、およびu256 の整数変数が含まれています。これらはすべて felt252 で実装されており、オーバーフローチェックが組み込まれています。整数変数を宣言する場合、変数の型を指定しない場合は、デフォルトで felt252 型になります。以下はコードの例です:

let y = 2;

u8、u16などを指定する場合は、変数の型を明示する必要があります:

let x:u8 = 2;

u256 型はやや複雑で、u256 型を作成するには他の型を使用する必要があります。u256 はコアライブラリ内の構造体であり、high と low の 2 つのフィールドは u128 型です。1 つのストレージスロット(felt252)に u256 型のデータを格納することはできないため、2 つのストレージスロットに分割して格納する必要があります。

let z: u256 = u256 { high: 0, low: 10 }

これには「高位セグメント」と「低位セグメント」という概念が関わっており、興味がある方は関連する資料を参照してください。

演算子#

整数はほとんどの演算子をサポートしており、オーバーフローチェックが組み込まれています。以下をサポートしています:

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(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');
}

また、u256 もこれらの演算子をサポートしています:

use debug::PrintTrait;

fn main() {
    let x:u256 = u256{high:3, low: 3};
    let y:u256 = u256{high:3, low: 3};

    let z = x + y;
    assert(z == 2 * y, 'z == 2 * y');
    assert(0 == x - y, '0 == x - y');
    assert(1 == x / y, '0 == x - y');
    assert(0 == x % y, '0 == x % y');

    assert(x == y, 'x == y');
    assert(x <= y, 'x <= y');
    assert(x >= y, 'x <= y');
    assert(x - 1 < y, 'x - 1 < y');
    assert(x + 1 > y, 'x + 1 >= y');
    assert(x != y - 1, 'x != y');
}

Boolean#

次のように宣言できます

let is_morning:bool = true;
let is_evening:bool = false;

Float#

サポートされていません

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。