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会推断出错误的类型