一、隐式转换
如果一个运算符两侧有不同类型的数据,编译器会隐式的尝试将一个操作数的类型,转为另一个操作数的类型。 一般来说,只要不丢失信息,值类型之间可以隐式转换。
pragma solidity ^0.4.24;
contract Conversion {
function implicit() public pure returns (uint256 ){
uint8 a = 1;
uint16 b = a;
uint32 c = a + b;
return c;
}
}
上面的例子中,我们将一个uint8的变量a隐式的转换为了uint16。同理它还支持转为uint32和uint256。
- 无符号整数可以从字节小的类型自动转换为字节大的类型;
- 有符号整数可以从字节小的类型自动转换为字节大的类型;
- 无符号整数可以从小的类型转为字节更大的有符号整数,但同样字节长度的不能自动转。
- 有符号整数无法自动转换为无符号整数。
- 小于或等于160个字节的无符号整数可以自动转为地址类型,但反之不行。
- 地址和有符号整数之间不能自动互转。
- 整数和布尔型不能直接互转。
- bytes可以从字节小的类型自动转换为字节大的类型。
二、显式转换
编译器不会将语法上不可转换的类型进行隐式转换,此时我们要通过显式转换的方式,比如将一个有符号整数,转为一个无符号整数。
pragma solidity ^0.4.0;
contract Conversion{
function explicit() returns (int8){
uint8 a = 1;
int8 b = int8(a);
return b;
}
}
不是所有类型之间都可以互转,比如bytes转换为int[],是不允许的,需要自己构造转换的方法。
三、 类型推断
有时为了方便,我们不会显式定义类型。但由于编译器,会自动挑选一个最恰当的类型,所以会常常留下坑。 在solidity中,和java一样,使用var来定义推断类型。而且一旦类型确定,则不能再修改。 我们来看这个例子:
pragma solidity ^0.4.4;
contract Deductoin{
function keng() returns (uint){
uint count = 0;
for (var i = 0; i < 2000; i++) {
count++;
if(count >= 2010){
break;
}
}
return count;
}
}
这个代码运行的结果实际为2100
。因为var i = 0
定义时,通过类型推断,i
的实际类型为uint8
,所以它会一直循环,如果没有count >= 2010
这个判断语句,这个循环将永远不会结束。
感谢您对本文的关注,如果您对区块链技术有兴趣,可以加入我们一起探讨, 请扫码关注“可可链”的微信公众号,并留言“加入可可链”。
本文欢迎转载,转载时请注明本文来自 微信公众号“可可链”。