布尔类型
跟其他语言一样,取值范围为:ture与false
Address类型
- 代表以太坊的地址,长度为20个字节,160位 ,uint160是所有地址都可以用的类型
话不多说,直接上案例:
contract addr {
address addr=0x8cC758f5a41bdF6Ab749944c737F86e6a4B4070B;
function getsenderaddr()view returns(address){
return msg.sender;
}
}
注意account账户
得到得地址为account地址。
好了,言归正传。。。。
Address类型用脚丫子想想就知道它并不支持四则运算。但是呢,它支持比较 ,还有一些它支持的属性。
话不多说,还是案例:
contract addr {
function getsenderaddr()view returns(address){
return msg.sender;
}
address addr=0x8cC758f5a41bdF6Ab749944c737F86e6a4B4070B;
function compare() view returns(bool){
return addr>msg.sender;
}
}
结果为false,我猜,身为读者的你,肯定会想为什么为false。
那么我来告诉你。这是两个地址的比较
address addr =0x8cC758f5a41bdF6Ab749944c737F86e6a4B4070B;
address addrcurrnt =0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;
它的原理为除了开头的0x,它会先比较8与C,16进制都知道C代表着12,肯定比8大,所以结果为false。如果第一个都是c它会比较后边的,以此类推。
好了,言归正传。。
Address 拥有自己的成员,比如,balance 余额。
function getbalance() view returns(uint){
return addrcurrnt.balance ;
}
这就是它的balance余额。
Address还有自己的方法,send()是转账时调用的。向某个地址发送货币。
send有个递归深度,不能超过1024。gas(手续费)不够的话会send失败!
contract addr {
function getsenderaddr()view returns(address){
return msg.sender;
}
address addr=0x8cC758f5a41bdF6Ab749944c737F86e6a4B4070B;
address addrcurrnt=0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;
function compare() view returns(bool){
return addr>msg.sender;
}
function getbalance() view returns(uint){
return addrcurrnt.balance ;
}
function chongzhi()payable returns(bool){
return address(this).send(msg.value);
}
}
可以看到vlaue充值成功。但是返回值为false,你知道为什么吗?
在solidity中没有单精度,双精度类型。
定长字节数组
表现形式:bytes,从bytes[1]开始到bytes[32],步长为1.bytes默认表示bytes[1],
而且bytes支持比较,和逻辑运算。
声明,初始化请看下面案例:
contract bytesdemo{
bytes1 a=0x8c;
bytes3 b=0xc3c18c;
function compare() view returns(bool){
return a>b;
}
}
逻辑运算
contract bytesdemo{
bytes1 a=0x8c;
bytes3 b=0xc3c18c;
function compare() view returns(bool){
return a>b;
}
bytes1 c = 0xaa;
function and() view returns(bytes1){
return a & c;
}
}
定长数组也有自己的属性
length
function getlength()view returns(uint){
return a.length;
}
bytes的长度在其定义好后并不能使用length去修改。否则会报错。
string字符串
string可以说是一个特殊的不定长的数组
如果读者学过c语言的话,你就会知道C语言中字符串得长度在其末尾会有个结尾符,但solidity中字符串没有结尾符,字符串有多少位,其长度就是多少位。
做个小案例吧,这样直观一些。
contract stringdemo{
string name ="wek";
function getlength()view returns(uint){
return bytes(name).length;
}
}
细心得读者可以发现返回值位uint类型,其默认的位数位256。
案例中也包含着类型转换。由string类型转换位bytes类型。
转换位bytes类型后,就可以获取string数据的长度,也可以获取指定下标的元素值,也可以改变指定下标的元素值。
contract bytestostring{
string name="wek";
function stb() view returns(bytes){
return bytes(name);
}
bytes bt=stb();
function bts()view returns(string){
bytes memory newbt = new bytes(bt.length);
for (uint8 index = 0;index<bt.length;index++){
newbt[index]=bt[index];
}
return string(newbt);
}
}
如果将bytes直接转的话会出错,所以需要开辟新内存,并new一个bytes然后再string(bytes)。