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#
サポートされていません