diff --git a/src/ch02-02-data-types.md b/src/ch02-02-data-types.md index e05f560..56365b7 100644 --- a/src/ch02-02-data-types.md +++ b/src/ch02-02-data-types.md @@ -1 +1,29 @@ -# Data Types +# 数据类型 + +Cairo中的每个值都是某种数据类型,这告诉Cairo正在指定哪种数据,以便它知道如何处理该数据。这一节涵盖了两个数据类型的子集:标量和复合数据类型。 + +请记住,Cairo是一种静态类型语言,这意味着在编译时必须确定所有变量的类型。编译器通常可以根据值及其用法推断出所需的类型。在许多类型可能的情况下,我们可以使用一个转换方法,其中指定所需的输出类型。例如,下面代码使用TryInto和OptionTrait trait将felt252类型转换为u32类型: + +use traits::TryInto; +use option::OptionTrait; +fn main() { + let x: felt252 = 3; + let y: u32 = x.try_into().unwrap(); +} + + +您将看到其他数据类型的不同类型注释。 + +标量数据类型 + +标量类型表示单个值。Cairo有三种基本标量类型:felts、整数和布尔值。您可能会从其他编程语言中认识到它们。让我们看看它们在Cairo中的工作原理。 + +Felt类型 + +在Cairo中,如果您没有指定变量或参数的类型,它的类型默认为一个位元素,表示为关键字felt252。在Cairo的上下文中,当我们说“一个位元素”时,我们意思是一个在范围0 <= x < P内的整数,其中P是一个非常大的素数,当前等于P = 2^{251} + 17 * 2^{192}+1。当执行加法、减法或乘法时,如果结果超出了指定范围的素数范围,将发生溢出,并添加或减去适当的P倍数,以将结果带回范围内(即,结果计算为模P)。 + +整数和字段元素之间最重要的区别是除法:字段元素的除法(因此在Cairo中的除法)与常规CPU的除法不同,其中整数除法x / y被定义为[x/y],其中返回商的整数部分(因此您获得7/3=2),并且它可能或可能不满足方程(x / y)*y == x,取决于x是否可被y整除。在Cairo中,x/y的结果被定义为始终满足方程(x / y)*y == x。如果y被作为整数划分x,您将在Cairo中得到预期结果(例如6/2确实会产生3)。但是当y不能整除x时,您可能会得到意想不到的结果。例如,由于2 * ((P+1)/2) = P+1 ≡ 1 mod[P],在Cairo中,1/2的值为(P+1)/2(而不是0或0.5),因为它满足上述方程式。 + +整数类型 + +felt252类型是一种基本类型,用作创建核心库中所有类型的基础。然而,强烈建议程序员只要可能就使用整数类型而不是felt252类型,因为整数类型带有附加的安全功能,可以提供额外的保护以防止代码中潜在的漏洞,例如溢出检查。通过使用这些整数类型,程序员可以确保他们的程序更加安全,并且不太容易受到攻击或其他安全威胁的影响。整数是没有分数部分的数字。此类型声明指示程序员可以用来存储整数的比特数。表3-1显示了Cairo中的内置整数类型。我们可以