solidtiy是一种静态类型语言,所以任何变量在使用之前都应该声明其特定类型。
solidity任何类型都没有值为undefined或者null的情况。但是任何类型的数据在没有赋值之前,都会有一个该数据类型的对应的default value。
bool修饰,值为true或者false
int${n}/uint${n}: 有符号或者无符号的整数。其中n为8、16... 256(8的倍数,从8到256),表示整数的位数
int/uint: 则是int256/uint256的别名
另外对于整数x,可以通过type(x).min或者type(x).max来获取对应类型的最小或者最大值。
可以通过x**n来实现求x的n次方,此时直接用 x*x*x...(n次相乘)能实现更少的gas费
0**0在evm中固定为1.
固定小数位数的数据在solidity中并不完全支持,这种类型的数字可以被申明,但是不能被赋值或者计算得到。
fixed${M}x${N}/ufixed${M}x${N}:有符号或者无符号的浮点数据,其中M表示整个数字所占的最大bit数,N表示小数的位数。(注意这里M表示的字节数是整个数字去掉小数点之后能表示的最大):
MN的测试
fixed8x1 num = 12.7; // 必须一个小数,且最大为12.7
fixed8x0 num2 = 127; // 不能有小数且最大为127
M的取值范围为8的倍数且为:[8, 256], N的取值范围为:[0, 80]。 fixed/ufixed:则是fixed128x18/ufixed128x18
一共有两种类型的地址:
可以使用balance属性来得到地址拥有的货币数量,可以通过transfer方法来转移货币。
Address members
address payable x = payable(0xd9145CCE52D386f254917e481eB44e9943F39138);
address myAddress = address(this);
if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10); // 注意这里是转入到x账户
注意transfer当接收方拒绝接收或者发送方gas费不足的情况会抛出异常并终止合约。另一个send函数,则只会返回false,不会终止合约继续运行。
类似于java中的类。合约类型的成员只的是external修饰的函数,可以使用type(c),来获取合约c的类型信息
bytes${n}:表示最大n字节的字符变量,其中n范围为[1, 32]
byte:表示bytes1
可以通过下标来访问该变量对应字节的数值,且.length属性返回定义的大小而不是实际使用的大小。
Bytes test
function getByteLen() external pure returns (uint) {
bytes2 b = '1';
return b.length; // 2
}
function getByteValue() external pure returns (bytes1) {
bytes2 b = '1';
return b[1]; // 0x00
}