1. 值类型:以下类型在传值时采用值传递

        a. 布尔(Booleans):

            i. bool可能取值为常量true和false、在不初始化的情况下,默认为false。

            ii. 支持运算符有 逻辑非(!)、逻辑与(&&)、逻辑(||)、等于(==)、不等于(!=)

            iii. 运算符&&和||是短路运算符,如f(x)||g(y),当f(x)为真时,则不会继续执行g(y)

            iv. bool与条件语句

        b. 整型(Integer):

            i. 变长的有符号或无符号整型。变量支持的步长以8递增,支持从uint8到uint256,以及int8到int256。需要注意的是,uint和int默认代表的是uint256和int256。

            ii. 支持的运算符

                1. 比较:<=,<,==,!=,>=,>,返回值为bool类型

                2. 位运算:&,|,(^异或),(~非)

                3. 数学运算:+,-,*,/,(%求余),(**乘方)

            iii. 注意 solidity不支持8进制

            iv. 整形的上溢和下溢

                1. 如果一个整形变量的值达到了它的最大值,再加一个大于0的数会变成0

                2. 如果一个整形变量的值达到了它的最小值,再减一个大于0的数会变成它的最大值

                3. 比如 uint8 a = 255 那么a + 1 = 0; uint8 b = 0, b - 1 = 255;

        c. 小数

            i. 字面量:如果字面量计算的结果不是一个整数,那么将会转换为一个对应的ufixed,或fixed类型。Solidity会选择合适的大小,以能尽量包含小数部分

            ii. 运算符:适用于整型的操作符,同时适用于数字的字面量运算表达式,当操作结果是整数时。如果有任何一方是有理数,将不允许使用位操作符。如果指数是小数,还将不能进行取幂运算

            iii. 二进制表示:大多数含小数的十进制,均不可被二进制准确表达,比如5.3743的类型可能是ufixed8*248。如果你想使用这样的值,需要明确指定精度x + ufixed(5.3743),否则会报类型转换错误

            iv. 截断:在当前版本中没有截断,5/2=2.5

            v. 字面量转换:数字的字面量表达式,一旦其中含有非字面量表达式,它就会被转为一个非字面量类型

    2. 引用类型:以下类型在传值时采用引用传递

        a. 不定长字节数组(bytes)

        b. 字符串(string)

        c. 数组(Array)

        d. 结构体(Structs)

    3. 基本类型之间的类型转换

        a. 隐式

            i. 如果运算符支持两边不同的类型,编译器会尝试隐式转换类型,同理,赋值时也是类似。通常,隐式转换需要能保证不会丢失数据,且语义可通。如uint8可以转化为uint16,uint256。但int8不能转为uint256,因为uint256不能表示-1。

            ii. 此外,任何无符号整数,可以转换为相同或更大大小的字节值。比如,任何可以转换为uint160的,也可以转换为address。

        b. 显示

            i. 如果不允许隐式类型转换,确保可以转换时可以采用强转

            ii. 注意如果由一个大的类型(uint32)转换为小的类型(uint16),高位会被截断

        c. 类型推断

            i. 使用var可以在第一次赋值的时候推断变量的类型,但不能用于函数的参数

            ii. Var 可以用来把函数赋值给一个变量

            iii. 注意 有时个 var会推断出错误的类型

 

  •