一、隐式转换

如果一个运算符两侧有不同类型的数据,编译器会隐式的尝试将一个操作数的类型,转为另一个操作数的类型。 一般来说,只要不丢失信息,值类型之间可以隐式转换。

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。

  1. 无符号整数可以从字节小的类型自动转换为字节大的类型;
  2. 有符号整数可以从字节小的类型自动转换为字节大的类型;
  3. 无符号整数可以从小的类型转为字节更大的有符号整数,但同样字节长度的不能自动转。
  4. 有符号整数无法自动转换为无符号整数。
  5. 小于或等于160个字节的无符号整数可以自动转为地址类型,但反之不行。
  6. 地址和有符号整数之间不能自动互转。
  7. 整数和布尔型不能直接互转。
  8. 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这个判断语句,这个循环将永远不会结束。


感谢您对本文的关注,如果您对区块链技术有兴趣,可以加入我们一起探讨, 请扫码关注“可可链”的微信公众号,并留言“加入可可链”。

本文欢迎转载,转载时请注明本文来自 微信公众号“可可链”。