• Solidity中的基本类型转换


    Solidity中的基本类型转换(十四)|入门系列
    2017/4/29 posted in Solidity入门系列
    点击查看原文,获得优化的排版。

    1. 隐式转换
      如果一个运算符能支持不同类型。编译器会隐式的尝试将一个操作数的类型,转为另一个操作数的类型,赋值同理。

    一般来说,值类型间的互相转换只要不丢失信息,语义可通则可转换。下面,我们来看一个整数转换的例子:

    pragma solidity ^0.4.0;

    contract Int{
    function conversion() returns (uint16){
    uint8 a = 1;
    //隐式转换
    uint16 b = a;

    return (b);
    

    }
    }
    上面的例子中,我们将一个uint8的变量a隐式的转换为了uint16。同理它还支持转为uint32,uint128和uint256。

    另外,无符号整数可以被转为同样,或更大的字节的类型。但需要注意的是,不能反过来转换。由于address是20字节大小,所以它与int160大小是一样。

    pragma solidity ^0.4.0;

    contract IntToAddress{
    function f() returns (uint){
    uint160 i = 10;
    address addr = i;
    return addr.balance;
    }
    }
    上面的例子中,将uint160的i转为了一个address。

    1. 显式转换
      编译器不会将语法上不可转换的类型进行隐式转换,此时我们要通过显式转换的方式,比如将一个有符号整数,转为一个无符号整数。

    pragma solidity ^0.4.0;

    contract ExplicitConversion{
    function f() returns (int8){
    uint8 a = 1;

    //强制转换
    int8 b = int8(a);
    return b;
    

    }
    }
    3. 类型推断
    有时为了方便,我们不会显式定义类型。但由于编译器,会自动挑选一个最恰当的类型,所以会常常留下坑,我们来看这个例子:

    pragma solidity ^0.4.4;

    contract Test{
    function a() returns (uint){
    uint count = 0;
    for (var i = 0; i < 2000; i++) {
    count++;
    if(count >= 2100){
    break;
    }
    }
    return count;
    }
    }
    大家可以想想上述代码运行的结果。

    上述代码运行的结果实际为2100。原因是因为var i = 0定义时,通过类型推断,i的实际类型为uint8,所以它会一直循环,如果没有count >= 2100这个判断语句,这个循环将永远不会结束。

    1. 一些常见的转换方案
      uint转为bytes
      将一个uint转转bytes,可以使用assembly1。

    function toBytes(uint256 x) returns (bytes b) {
    b = new bytes(32);
    assembly { mstore(add(b, 32), x) }
    }
    上面的转换方式可能是效率最高的方式。

    string转为bytes
    string可以显示的转为bytes。但如果要转为bytes32,可能只能使用assembly2。

    pragma solidity ^0.4.0;

    contract StringToBytes{
    function StringToBytesVer1(string memory source) returns (bytes result) {
    return bytes(source);
    }

    function stringToBytesVer2(string memory source) returns (bytes32 result) {
    assembly {
    result := mload(add(source, 32))
    }
    }
    }

  • 相关阅读:
    st-load视频性能测试
    gitlab-ci集成SonarQube代码质量检查
    退役记
    洛谷 P5195 【[USACO05DEC]Knights of Ni S】
    洛谷 P4742 【[Wind Festival]Running In The Sky】
    洛谷 SP13105 【MUTDNA
    洛谷 P3174 【[HAOI2009]毛毛虫】
    洛谷 P1542 【包裹快递】
    Python函数的返回值
    ubuntu18.04修改国内apt源
  • 原文地址:https://www.cnblogs.com/xiaocongcong888/p/9829592.html
Copyright © 2020-2023  润新知