总述
solidtiy是一种静态类型语言,所以任何变量在使用之前都应该声明其特定类型。
solidity任何类型都没有值为undefined或者null的情况。但是任何类型的数据在没有赋值之前,都会有一个该数据类型的对应的default value。
数据类型
Booleans
bool修饰,值为true或者false
Integer
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.
Fixed Point Numbers
固定小数位数的数据在solidity中并不完全支持,这种类型的数字可以被申明,但是不能被赋值或者计算得到。
fixed${M}x${N}/ufixed${M}x${N}:有符号或者无符号的浮点数据,其中M表示整个数字所占的最大bit数,N表示小数的位数。(注意这里M表示的字节数是整个数字去掉小数点之后能表示的最大):
MN的测试
fixed8x1 num = 12.7; // 必须一个小数,且最大为12.7
fixed8x0 num2 = 127; // 不能有小数且最大为127
Address
一共有两种类型的地址:
- address: 保存20个字节的值,代表一个以太坊的地址。
- address payable:同address,不过包含transfer和send属性。
address payable可以直接隐式转换成address,而address要转换成payable address需要显示使用payable()来进行。
可以使用address来显示转换uint160,byte20为地址类型。但是只有address或者合约类型才能通过payable显示转换为payable address类型(合约必须是可以接收以太币(有receive方法或者payable修饰的方法))。
Address的属性
可以使用balance属性来得到地址拥有的货币数量,可以通过transfer方法来转移货币。
Address members
address payable x = payable(0xd9145CCE52D386f254917e481eB44e9943F39138);
address myAddress = address(this);
if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10); // 注意这里是转入到x账户
Contract Types
类似于java中的类。合约类型的成员只的是external修饰的函数,可以使用type(c),来获取合约c的类型信息
Fixed-size byte arrays
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
}